2015-09-22 74 views
4

我有以下設置:我用PHPUnit嘲弄非抽象類,但不是所有的方法。因此,非模擬方法仍然存在,作爲對模擬中真實方法的調用。模擬類:方法暗示

問題是:如何提示這些方法是可用的(當然,有適當的簽名)?

我會詳細說明一下。類的示例:

class RealClass 
{ 
    public function callApi(Api $api) {} 

    public function doStuff(Foo $foo, Bar $bar) {} 
} 

現在我在測試做:

$mock->doStuff($foo, $bar); 

/** @var \PHPUnit_Framework_MockObject_MockObject $mock */ 
$mock = $this->getMock('\RealClass', ['callApi']); 

這將爲callApi()只,但隨後如果在測試中我做創建模擬我的PHPStorm找不到明顯的方法,並認爲這是一個錯誤。我如何指出doStuff()方法存在並需要正確的參數?

@method似乎只能在類定義內工作。我試圖玩@see,但無法解決此事。另外,理想的解決方案是允許在return語句中指定提示,因爲我可能想從測試助手方法返回模擬。

「便宜的作弊」是暗示與原來的類,但我不想做,因爲那樣我就會失去這一點 - 這是模擬的,哪些不是。這尤其重要,因爲我使用助手來構建注入mock的複雜實體。

回答

3

你應該暗示模擬無論是作爲MockObjectRealClass一個實例,所以你會得到這樣的:

/** @var \RealClass|\PHPUnit_Framework_MockObject_MockObject $mock */ 
$mock = $this->getMock('\RealClass', ['callApi']); 

現在你告訴PhpStorm是$mock可以是一個PHPUnit的MockObject a RealClass實例,它將接受來自任一類的/自動完成方法。

此外(而這僅僅是一個友好的忠告,而不是在所有必要的),你可以使用use關鍵字的類導入您的測試類,所以你的提示可以變得有些更具可讀性:

<?php 

use \RealClass; 
use \PHPUnit_Framework_MockObject_MockObject as MockObject; 

class YourTestClass 
{ 
    public function yourTest() 
    { 
     // Because of the use statements (and the "as" alias rule) you can now: 
     /** @var RealClass|MockObject $mock */ 
     $mock = $this->getMock('RealClass', ['callApi']); 
    } 
} 
+0

但是再次 - 我無法區分它是否在某個地方是模擬的。這是非常重要的,因爲當我建立存根提供者時,我需要知道某一行 - 不管是否被嘲弄。現在我只是做了命名的區別(命名變量$ fooMock,$ barMock)。所以如果情況會如此 - 那麼我只會用原創課程暗示它,就是這樣。謝謝你的回答,+1無論如何 –

+0

當使用這樣的模擬時,只有'callApi'方法被模擬出類,其他方法將從真實類中使用,所以你不會嘲笑整個類,只是該方法(因此應該總是知道你正在處理哪一個)。除非我誤解了,但也許最好另外打開一個問題,提供更多細節。 – Oldskool

+0

是的,我知道。但想象一下這種情況 - 你需要區分某些'$ something'是否是模擬的。那個'$ something'是從我暗示'@return RealClass | MockObject'的幫助者返回的。現在 - 怎麼說,是不是模擬?是的,它將從兩者中組合方法,但實體本身的身份不明確。這就是我在答案中指出的 - 這就是我現在缺乏的。 –