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 环境)
我 运行 遇到了一些关于 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 环境)