5

我正在尝试使用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

我究竟做错了什么?

4

6 回答 6

8

通过查看Codeception L4 示例应用程序,我可以通过将以下行添加到project/app/tests/_boostrap.php来了解如何引导自动加载来解决此问题:

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();
于 2013-10-31T14:11:38.337 回答
3

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

class TestModel extends TestCase {
}
于 2014-01-29T01:03:47.340 回答
3

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

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

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

老实说,我不确定它为什么有效,但它确实有效!如果我弄清楚原因或有人发表评论,我会进行编辑。

于 2015-08-19T19:39:24.633 回答
0

您可以转到 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);
}
于 2014-07-24T13:03:07.727 回答
0

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

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

于 2014-02-09T12:09:31.743 回答
0

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

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

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

于 2016-06-01T10:13:30.173 回答