带有 Codeception 的 Laravel 4 模型单元测试 - 未找到“Eloquent”类

Posted

技术标签:

【中文标题】带有 Codeception 的 Laravel 4 模型单元测试 - 未找到“Eloquent”类【英文标题】:Laravel 4 model unit test with Codeception - Class 'Eloquent' not found 【发布时间】:2013-11-09 19:35:37 【问题描述】:

我正在尝试使用 Codeception 运行我的 Laravel 4 单元测试。

为没有依赖关系的简单类运行测试可以正常工作。但是当我实例化一个依赖于 Eloquent 的模型时,我得到了这个致命错误:

PHP 致命错误:在第 4 行的 /var/www/project/app/models/Role.php 中找不到“Eloquent”类

单元测试:

<?php
use Codeception\Util\Stub;
class TestModel extends \Codeception\TestCase\Test 

  public function testExample()
  
    $role = new Role;
    $role->name = 'superuser';
    $this->assertEquals('superuser', $role->name);
  

型号:

<?php
class Role extends Eloquent

  public function users()
  
    return $this->belongsToMany('User');
  

项目结构:

我正在从项目根目录运行 vendor/bin/codecept 运行单元,文件结构如下:

/project
  codeception.yml
  /vendor/bin/codecept
  /app
    /tests
      unit.suite.yml
      /unit
         ExampleTest.php
    /models
       Role.php
                ...etc

我做错了什么?

【问题讨论】:

我特别不知道代码接收,但是对于 PHPUnit,你至少需要bootstrap the class autoloading。或许 Codeception 也是如此。 我知道这太晚了,但是在你安装了 composer 包之后。您输入站点的根目录。 “vendor/bin/codecept _bootstrap”,它将为您生成文件。 【参考方案1】:

通过查看Codeception L4 sample app,我可以通过将这些行添加到 project/app/tests/_boostrap.php 来了解如何引导自动加载来解决此问题:: p>

include __DIR__.'/../../vendor/autoload.php';
$app = require_once __DIR__.'/../../bootstrap/start.php';
\Codeception\Util\Autoload::registerSuffix('Page', __DIR__.DIRECTORY_SEPARATOR.'_pages');

编辑:从 Laravel 4.0 升级到 4.1 时,还需要多加一行:

$app->boot();

【讨论】:

小心包含路径!【参考方案2】:

我可能迟到了,但如果你不需要密码学的东西。您应该扩展 laravel 的 PHPUnit_Framework_TestCase 实现,称为 TestCase。像这样:

class TestModel extends TestCase 

【讨论】:

【参考方案3】:

这个问题的答案现在有点过时了。使用 Laravel 5 我遇到了同样的错误(找不到类 'Eloquent'...)并通过从 Laravel 库 TestCase.php file 复制代码来解决它。该文件用于在 Laravel 框架内进行测试(不使用 codeception)。

要修复“找不到 Eloquent”错误,请将以下行添加到 project/tests/unit/_bootstrap.php

<?php
$app = require __DIR__.'/../../bootstrap/app.php';
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();

老实说,我不确定它为什么有效,但确实有效!如果我找出原因或有人 cmets,我会进行编辑。

【讨论】:

【参考方案4】:

运行单元测试时找不到Eloquent 类。

尝试将use Illuminate\Database\Eloquent\Model as Eloquent; 添加到Role.php

【讨论】:

【参考方案5】:

您可以转到 TestCase 类并通过添加 auth 或一些来覆盖方法 refreshApplication(向 TestCase 添加方法):

protected function refreshApplication()

    $this->app = $this->createApplication();

    $this->client = $this->createClient();

    $this->app->setRequestForConsoleEnvironment();

    $this->app->boot();

    // authenticate your user here, when app is ready
    $user = new User(array('username' => 'John', 'password' => 'test'));
    $this->be($user);

【讨论】:

【参考方案6】:

我通过将以下几行添加到 _bootstrap.php 解决了 Laravel 4 和 Codeception 的类似问题

$app = require __DIR__.'/../../bootstrap/start.php'; $app->boot();

希望这对谷歌同事有所帮助!

【讨论】:

以上是关于带有 Codeception 的 Laravel 4 模型单元测试 - 未找到“Eloquent”类的主要内容,如果未能解决你的问题,请参考以下文章

Codeception sqlite:Laravel 4 中针对 Mockery 的内存

使用 codeception 和 selenium 对 laravel 应用程序进行验收测试时更改 env

授权标头未通过 Codeception API 测试

如何在 Codeception 功能测试中使用 PHPUnit 断言方法?

Symfony/Codeception 运行错误

Codeception,使用 pageObject 设计模式和 gherkin 编写验收测试