2011-09-15 39 views
33

當我創建一個新的模擬我需要調用期望方法。它究竟做了什麼?那麼它的論點呢?PHPUnit:期望的方法含義

$todoListMock = $this->getMock('\Model\Todo_List'); 
     $todoListMock->expects($this->any()) 
      ->method('getItems') 
      ->will($this->returnValue(array($itemMock))); 

我無法找到任何地方的原因(我試過文檔)。我已閱讀資料,但我無法理解。謝謝。

回答

37

預計() - 設置你多少次想到被稱爲方法:

$mock = $this->getMock('nameOfTheClass', array('firstMethod','secondMethod','thirdMethod')); 
$mock->expects($this->once()) 
    ->method('firstMethod') 
    ->will($this->returnValue('value')); 
$mock->expects($this->once()) 
    ->method('secondMethod') 
    ->will($this->returnValue('value')); 
$mock->expects($this->once()) 
    ->method('thirdMethod') 
    ->will($this->returnValue('value')); 

如果你知道,該方法被調用一次使用$這 - (),否則使用$ this-> any()

請參閱:
PHPUnit mock with multiple expects() calls

https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.stubs

http://www.slideshare.net/mjlivelyjr/advanced-phpunit-testing

+1

如果它被調用一次,然後又被調用,會發生什麼? – thom

+0

如果方法預計被調用一次將被稱爲更多次,測試可能會失敗 –

+12

不僅*可能*,但*絕對*;) – Gordon

41

走進一看源代碼會告訴你:

/** 
* Registers a new expectation in the mock object and returns the match 
* object which can be infused with further details. 
* 
* @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher 
* @return PHPUnit_Framework_MockObject_Builder_InvocationMocker 
*/ 
public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher); 

而且PHPUnit的手冊列出了可用的匹配器在

  • 任何( )返回一個匹配器,該匹配器在執行零次或多次執行的評估方法時匹配。
  • never()返回一個匹配器,該匹配器匹配的方法被評估爲從未執行。
  • atLeastOnce()返回一個匹配器,該匹配器在執行至少一次被執行的方法時匹配。
  • once()返回一個匹配器,該匹配器匹配於被評估的方法執行一次。
  • exactly(int $ count)返回一個匹配器,該匹配器匹配的方法被執行的時候正好執行$ count次。
  • at(int $ index)返回一個匹配器,該匹配器在給定的$ index下調用它的方法時被匹配。
+1

需要注意的是在()從0開始,我發現了一些通過今天的試驗和錯誤的艱辛的道路。 – PressingOnAlways

+3

另外請注意,at()對模擬對象上的所有stubbed方法使用相同的計數器。它不會爲每種方法分配一個新的計數器。 – ankr