可以說我有這樣的代碼塊:PHPUnit的檢查方法被調用的測試類
$i = 1;
if ($i > 1) {
$this->methodOne();
} else {
$this->methodTwo();
}
我如何檢查是否methodOne或methodTwo從被測試類在我PHPUnit的測試叫什麼名字?
可以說我有這樣的代碼塊:PHPUnit的檢查方法被調用的測試類
$i = 1;
if ($i > 1) {
$this->methodOne();
} else {
$this->methodTwo();
}
我如何檢查是否methodOne或methodTwo從被測試類在我PHPUnit的測試叫什麼名字?
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();
我知道我可以嘲笑並分別測試方法,我正在尋找的是測試methodOne從測試單元本身調用。如果我在測試MainMethod(),在某些情況下調用methodOne() - 我想檢查它是否被稱爲 – jvrnt
是的,這是我在我的答案中描述的,也許我不完全清楚:)對於測試單位,你使用部分模擬,即覆蓋。只有你感興趣的方法來設置期望值。然後你設置你需要的方法的期望值,並調用MainMethod(),確保if()語句繼承你想要的分支。 – Cristik
我更新了我的答案中的示例代碼,以更好地說明我想說的內容。 – Cristik