2015-04-14 46 views
0

可以說我有這樣的代碼塊:PHPUnit的檢查方法被調用的測試類

$i = 1; 

if ($i > 1) { 
    $this->methodOne(); 
} else { 
    $this->methodTwo(); 
} 

我如何檢查是否methodOne或methodTwo從被測試類在我PHPUnit的測試叫什麼名字?

回答

0

methodOne和methodTwo公開嗎?如果是的話,那麼你可以爲這些人添加測試,以確保他們正確工作,所以你堅持對你的方法的其他代碼。如果它們不是公開的,那麼根據討論中的方法的輸出結果,可以知道調用了哪個方法。

最後,我認爲你更關心你的班表現正確,而不是被調用方法的內部鏈。同時請記住,單元測試可以進行黑盒測試,並且不應該關心正在測試的方法的實現。

而不是最後,在$ this上調用的方法斷言會嚴重地將您的測試與類的實現耦合在一起。因此,如果您重構類,您還需要更新不再有效的測試。而且越來越難以測試內部方法是否按您需要的順序調用。

把所有這些話都放在一邊,這並不意味着你問的問題不能做到。您可以使用部分模擬(https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.mock-objects),並在部分模擬上進行斷言,而不是創建新的測試對象。例如:

$testedObject = $this->getMock('MyClass',array('methodOne', 'methodTwo')) 

會給你一個只有methodOne和methodTwo被PHPUnit所取代的對象。然後,您可以設置什麼方法?需要一個名爲預期:

$testedUnit = $this->getMock('MyClass',array('methodOne', 'methodTwo')); 
$testedUnit->expects($this->once()) 
    ->method('methodOne'); 
// setup the condition so that the tested method calls methodOne() 
// ... 
$testedUnit->testedMethod(); 
+0

我知道我可以嘲笑並分別測試方法,我正在尋找的是測試methodOne從測試單元本身調用。如果我在測試MainMethod(),在某些情況下調用methodOne() - 我想檢查它是否被稱爲 – jvrnt

+0

是的,這是我在我的答案中描述的,也許我不完全清楚:)對於測試單位,你使用部分模擬,即覆蓋。只有你感興趣的方法來設置期望值。然後你設置你需要的方法的期望值,並調用MainMethod(),確保if()語句繼承你想要的分支。 – Cristik

+0

我更新了我的答案中的示例代碼,以更好地說明我想說的內容。 – Cristik

相關問題