使用Codeception进行Laravel 4模型单元测试 - 找不到类'Eloquent'

时间:2013-10-30 09:41:15

标签: laravel phpunit laravel-4 eloquent codeception

我正在尝试使用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 run unit ,具有以下文件结构:

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

我做错了什么?

6 个答案:

答案 0 :(得分:8)

通过查看Codeception L4 sample app,我能够看到如何通过将这些行添加到 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();

答案 1 :(得分:3)

我可能迟到了派对,但如果你不需要代码的东西。你应该扩展laravel的PHPUnit_Framework_TestCase实现,只需要TestCase。像这样:

class TestModel extends TestCase {
}

答案 2 :(得分:3)

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

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

JOIN

老实说,我不确定它为什么会起作用,但确实如此!如果我弄清楚为什么或有人评论,我会编辑。

答案 3 :(得分:0)

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

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

答案 4 :(得分: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);
}

答案 5 :(得分:0)

我通过将以下行添加到_bootstrap.php

解决了Laravel 4和Codeception的类似问题

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

希望这有助于一位googler!