Laravel 5单元测试和名称间隔


Laravel 5 Unit Testing and Namespacing

我在Laravel 5中遇到了一些关于PHPUnit的问题。我正试图在我的一条路线上做一个简单的测试,它当然会调用Model,但当它调用时,我遇到了一个意外的错误。

PHP致命错误:在中找不到类"Eloquent"/home/app/Models/User.php在线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。(这实际上是通过类别名autoloader来完成的)。

由于某些原因,在您的测试环境中不会发生这种情况。如果你不知道为什么,我会在你的测试开始时尝试以下方法

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

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

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

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