2014-09-30 53 views
1

我開始使用PHP單元,並且我正在嘗試爲需要作爲類的__construct方法中的依賴項來測試類的雄辯模型構建模擬。PHP單元存儲庫測試案例的模擬雄辯模型

這是我的類的構造函數我想測試:

namespace App\Repository\Link; 

use App\Repository\RepositoryAbstract; 
use Illuminate\Database\Eloquent\Model; 

class EloquentLink extends RepositoryAbstract implements LinkInterface 
{ 
    protected $link; 

    public function __construct(Model $link) 
    { 
     $this->link = $link; 
    } 
} 

我的測試類是這樣的:

namespace App\Repository\Link; 

use Link as ModelLink; //Link is the Eloquent model to pass as constructor for EloquentLink 
use Illuminate\Database\Eloquent\Model as Eloquent; //Link extends Eloquent 

class EloquentLinkTest extends \PHPUnit_Framework_TestCase 
{ 
    protected $modelMock; 
    protected $link; 

    public function setUp() { 
     $this->modelMock = $this->getMockBuilder('ModelLink')->getMock(); 
     $this->link = new EloquentLink($this->modelMock); 
    } 

    public function testCase() 
    { 
     //comes here 
    } 
} 

我得到這個錯誤:

1)應用程序\ Repository \ Link \ EloquentLinkTest :: testCase 傳遞給App \ Repository \ Link \ EloquentLink :: __ construct()的參數1必須是Illuminate \ Database \ Eloquent \ Model的實例,Mock_ModelLink的實例_ea1343ff給出

我該如何讓模擬擴展Model類?

回答

1
use Link as ModelLink; 

此作用域ModelLink名稱指向存在於包含文件(測試情況)的目的,全局命名空間的Link類。

$this->modelMock = $this->getMockBuilder('ModelLink')->getMock(); 

這將走出去,創造存在於全局命名空間的ModelLink類的模擬對象,在上下文中的另一個文件,包含該getMockBuilder方法的定義,即取其類文件。

這裏的要點是,兩種情況是完全不同的。有這句話,我們可以看一下說明書指導:

Note: Importing rules are per file basis, meaning included files will NOT inherit the parent file's importing rules.

試着改變你的電話本,看看它是否適合你:

$this->modelMock = $this->getMockBuilder('Link')->getMock(); 

,如果你要這將是不同的將在您的測試用例中創建的ModelLink對象的實例傳遞給getMockBuilder,但由於它將字符串作爲參數,因此我們可以推斷它必須負責僅從類名創建模擬對象。如果沒有其他信息可用,則無法將其傳遞給別名類,並希望它能夠正確定位有效的類。在這種情況下,它只是猜測並創建一個空的ModelLink對象的模擬(與您的原始Link對象的零關係)。

+0

謝謝你,我更換了一件與你的信息。在模型中,鏈接擴展Eloquent(這是一個用於Illuminate \ Database \ Eloquent \ Model的laravel別名)。所以我將其更改爲:class Link擴展了Illuminate \ Database \ Eloquent \ Model – Barry127 2014-09-30 20:08:59

+0

沒有什麼錯,但_that_'別名'提供的級別高於PHP語言,特別是Laravel應用程序。如果這也引發了一個問題,那麼你可能會改變你的測試用例,從'app/tests/TestCase.php'擴展而不是直接從'PHPUnit_Framework_TestCase'擴展。該類將處理引導Laravel應用程序(包括'Eloquent'外觀) – 2014-09-30 20:12:48