2017-03-27 50 views
0

我試圖嘲弄應該有傳遞給它的設定值的DateTime對象的方法隨着與嘲弄日期時間函數對象

$mock->shouldReceive('setDatetime') 
      ->with($datetime) 
      ->once; 

我是相當新的嘲弄,但我不明白如何'與'工作。如果$ datetime是傳入'setDatetime'的確切對象,那麼它完美地滿足條件。如果它是一個日期時間對象,但不完全相同的對象,即所有的值都是相同的,但它是一個不同的實例化的DateTime對象,則它不起作用。我當前傳遞給setDatetime的Datetime對象已經使用DateInterval進行了更改。無論如何,我可以測試收到的日期時間對象是否具有相同的值,即使它不是相同的對象。

回答

0

這可以通過給()關閉。

爲了給封閉到與功能嘲弄爲您提供了一個封閉匹配

Mockery\Matcher\Closure 

這個類將採取關閉和用它來搭配你的價值。

你將如何實現這個是這樣的:

$expectedDateTime = new DateTime(); 
$mock->shouldReceive('setDatetime') 
      ->with 
       (new Closure(
       function($datetime) use ($expectedDateTime) { 
        return $datetime->getTimestamp() === $expectedDateTime->getTimeStamp() 
       } 
       ) 
      )->once; 

的epextedDateTime是當然的日期時間,它應該是,但例如在這裏加入的目的。你也可以在閉包中創建DateTime對象,如果你不需要它在斷言之外,那麼你不需要在閉包中使用它。

當然,您可以在閉包中檢查/聲明任何您想要的內容,例如我做了檢查時間戳是否相等的最簡單測試。

0

另一種解決方案是使用\Hamcrest\Matchers::equalTo。通過這種方式,您可以明確地將比較設置爲==(等於)而不是===(嚴格)。您只需要這個對象,因爲對於基元,它會自動檢查==比較作爲後備。

實施例:

$mock->shouldReceive('setDatetime') 
    ->with(\Hamcrest\Matchers::equalTo($datetime)) 
    ->once; 

文檔寫入以下:

最常見的匹配是用()匹配:

它告訴解嘲它應該接收到呼叫以整數1作爲參數的foo方法。在這種情況下,Mockery首先嚐試使用===(相同)比較運算符來匹配參數。如果參數是一個基元,並且如果它失敗了相同的比較,Mockery會回退到==(等於)比較運算符。

當匹配對象作爲參數時,Mockery只執行strict ===比較,這意味着只有相同的$對象纔會匹配。

來源:http://docs.mockery.io/en/latest/reference/argument_validation.html