簡體   English   中英

Laravel 5單元測試和命名空間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM