[英]Laravel 5 Unit Testing and Namespacing
我正在使用Namespacing在Laravel 5中遇到有關PHPUnit的一些問題。 我正在嘗試對其中一條路線進行簡單測試,該路線當然稱為模型,但是在進行調用時遇到了意外錯誤。
PHP致命錯誤:在第10行的/home/app/Models/User.php中找不到類'Eloquent'
這是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環境。 (描述您如何創建測試將有助於人們追蹤到這一點)
問題是,有沒有全球Eloquent
在Laravel類。 但是,有一個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
一樣使用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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.