Laravel 5单元测试和命名空间

时间:2015-04-07 20:19:57

标签: php laravel namespaces phpunit

我在使用Namespacing的Laravel 5中遇到了一些关于PHPUnit的问题。我试图在我的一条路线上进行简单的测试,当然这个路线叫做模型,但我在拨打电话时遇到意外错误。

  

PHP致命错误:Class' Eloquent'找不到   第10行/home/app/Models/User.php

以下是User.php

的相关代码块
<?php

use Laravel\Cashier\Billable;
use Laravel\Cashier\Contracts\Billable as BillableContract;
use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends \Eloquent implements AuthenticatableContract, CanResetPasswordContract, BillableContract {

我似乎在测试环境中遇到了与NameSpacing有关的问题。我不想改变我的模型,因为它与我的应用程序一样精确。

如何在不直接更改应用程序的情况下使PHPUnit环境与我的应用程序交互?

2 个答案:

答案 0 :(得分:2)

我的猜测是这不是名称空间问题,而是你不是(故意或无意中由于与Laravel认为的标准有些偏离)使用Laravel的基础测试类,或者如果你是你的以某种方式对它们进行了修改,使得您不会在测试中引导Laravel环境。 (描述你如何创建测试将有助于人们追踪这一点)

问题是Laravel中没有全局Eloquent类。但是,有一个Eloquent别名。如果您查看app.php配置文件,您将看到一组别名。

#File: config\app.php
'aliases' => [
    //...
    'Eloquent'  => 'Illuminate\Database\Eloquent\Model',
    //...

Laravel使用内置的PHP函数class_alias

设置这些别名
class_alias('Illuminate\Database\Eloquent\Model', 'Eloquent');

这使您可以使用Eloquent,就像它是一个类一样。 (这实际上是通过class alias autoloader)的方式完成的。

出于某种原因,这不会发生在您的测试环境中。如果您无法弄清楚原因,我会在测试开始时尝试以下内容

class_alias('Illuminate\Database\Eloquent\Model', 'Eloquent');

这将手动设置别名,这可以让你运行测试。 (但是,如果您在测试中使用Laravel模型和其他框架功能,那么您真的想弄清楚为什么您的测试环境不能引导Laravel环境)

答案 1 :(得分:1)

尝试在test的setUp函数中添加parent :: setUp(),以确保您的测试环境得到正确设置。

/**
 * Default preparation for each test
 *
 */
public function setUp()
{
    parent::setUp(); // Don't forget this!

    $this->prepareForTests();
}