我在 Laravel 5 中使用命名空间遇到了一些有关 PHPUnit 的问题。我正在尝试对我的一条路线进行简单的测试,该路线当然会调用模型,但在调用时出现意外错误。
PHP Fatal error: Class 'Eloquent' not found in /home/app/Models/User.php on line 10
这是来自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 {
我在测试环境中的命名空间似乎遇到了一些问题。我不想更改我的模型,因为它完全按照我希望的方式与我的应用程序一起工作。
如何在不直接更改应用程序的情况下使 PHPUnit 环境与我的应用程序交互?
最佳答案
我的猜测是这不是命名空间问题,而是您没有(有意或无意地由于与 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 环境)
关于php - Laravel 5 单元测试和命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500549/