Laravel 5 单元测试和命名空间

Laravel 5 Unit Testing and Namespacing

我 运行 遇到了一些关于 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 环境与我的应用程序交互?

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

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

    $this->prepareForTests();
}

我的猜测是这不是命名空间问题,而是您没有使用 Laravel'(由于偏离 Laravel 认为的规范,有意或无意) s 基础测试 classes,或者如果你是,你已经以某种方式修改了它们,这样你就不会在测试中引导 Laravel 环境。 (描述您如何创建测试将有助于人们追踪这一点)

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

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

Laravel 使用内置的 PHP 函数设置这些别名 class_alias

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

这就是让您像使用 class 一样使用 Eloquent 的原因。 (这实际上是通过 class alias autoloader 的方式完成的)。

出于某种原因,这在您的测试环境中没有发生。如果您不明白为什么,我会在您的测试开始时尝试以下操作

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

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