我在使用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环境与我的应用程序交互?
答案 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();
}