2011-04-29 77 views
4

使用PHPUnit,我想知道如何從同一個存根/模擬中獲得多個期望。PHPUnit模擬多個期望()調用

例如,我想測試模擬將調用方法display()並返回NULL。我也想測試將調用方法process()

其實我的測試叫做testProcessIsCalledIfDisplayReturnNull()

所以我需要設置相同的模擬對象2點的預期,手冊沒有真正幫助有關:(

回答

5

如果你知道,該方法被調用一次使用$這 - >一次()的預期(),否則使用這個 - $>任何()

$mock = $this->getMock('nameOfTheCalss', 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')); 
+0

根據我的理解,只有在認爲重要時才應使用once()方法,該方法只能被調用一次 - 當調用方法多於或少於一次的代碼應該被視爲中斷。如果當前實現調用一次,但將來可以將其更改爲零或更多,然後使用any()。這使得以後更容易更改代碼。 – bdsl 2017-06-02 19:28:17

5

我已經試過這一點,似乎只要可以作爲來電訂購撐好:

$mock = $this->getMock('mockWorker', array('display', 'process')); 
$mock->expects($this->exactly(1)) 
    ->method('display') 
    ->will($this->returnValue(null)); 
$mock->expects($this->exactly(1)) 
    ->method('process'); 
+3

您可以使用'一次()'而不是'完全(1)'。請記住,並不是在兩個期望之間創建一個排序,但它通常足夠好。如果你需要特定的順序,使用'at($ index)'。 – 2011-04-29 17:36:50