2017-03-02 26 views
0

我有以下的模擬對象:PHP模擬 - >預計,()不報告不叫當錯誤

$permutator = $this->getMockBuilder('PermutationClass', 
array('get_permutation'))->disableOriginalConstructor()->getMock(); 

$permutator->expects($this->at(0)) 
        ->method('get_permutation') 
        ->will($this->returnCallback(function($praram1) { 
         return true; 
        })); 
$permutator->expects($this->at(1)) 
        ->method('get_permutation') 
        ->will($this->returnCallback(function($praram1) { 
         return true; 
        })); 

然而,我所經歷的是,如果由於某種原因在調用「1」永遠不會被執行,那麼沒有錯誤報告關於永遠不會滿足的期望。

如果我添加以下代碼:預計在右側前:

$permutator->expects($this->exactly(2))->method('get_permutation'); 

那麼什麼情況是,如果給定的期望從來沒有所謂的錯誤會被報告。但是,這裏發生的是由於某種原因,這使得模擬對象的返回值爲NULL,因爲我沒有設置它。如果我這樣設置:

$permutator->expects($this->exactly(2))->method('get_permutation')->will($this->returnValue("THIS SHOULD NEVER BE RETURNED")); 

然後,這將成爲該函數的所有預期方法調用的返回值。因此,在(0)和(1)就得到執行(我設置一些打印語句),但返回的值是通過這個重寫:

$permutator->expects($this->exactly(2))->method('get_permutation'); 

我設法得到預期的行爲使用:

$permutator->expects($this->exactly(2)) 
      ->method('get_permutation') 
      ->will($this->onConsecutiveCalls(
         $this->returnCallback(function($praram1) { 
          return true; 
         }), 
         $this->returnCallback(function($praram1) { 
          return false; 
         }) 
        ) 
      ); 

我得到的是爲什麼模擬對象不會抱怨說,當我明確設定期望時,$ this-> at(1)從來不會被調用?

+0

您確定該方法沒有被調用嗎?我用$ this-> at()做了一個簡單的例子,如果方法只被調用一次,它就會失敗。我認爲你的代碼中還有其他事情正在發生。 – Schleis

回答

-1

這不是expects所做的 - 它所做的只是告訴模擬該函數被調用時返回的內容。它是不是一個斷言。

如果你想斷定方法是所謂的,我會去了解一下https://github.com/phpspec/prophecy#spies

或者,你可以使用returnCallback保存被稱爲該參數,可以再比較,爲你知道什麼是應該的,所以例如:

$params = []; 
$permutator->expects($this->any()) 
->method('get_permutation') 
->will($this->returnCallback(
    function($param) use (&$params){ 
     $params[] = $param); 
    } 
)); 

doTheThing(); 

$this->assertEquals(
    array(1,2), 
    $params 
); 
+0

我明白你的觀點。儘管「 - >期望($ this-> exactly(2)) - > ...」完全如此。但是,我想我對「 - >期望(在...)」的期望並不完全正確。我設法實現了我想要在ConsecutiveCalls上做的事情。 –

+0

'expect()'設置了在測試結束時驗證的期望值。期望是一個斷言。 –