2017-03-02 3 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'); 

は、次に何が起こるかは与えられた期待が呼び出されなかった場合は、エラーが報告されるということです。しかし、ここで何が起きるのか何らかの理由で、私はそれを設定しなかったので、mockオブジェクトの戻り値はNULLになります。私はそうのようにそれを設定した場合:

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

その後、これは、その関数の予想されるメソッド呼び出しのすべての戻り値となります。だから、(0)で、かつ(1)で実行されるのですか(私はいくつかのprint文を設定)が、戻り値はこれで上書きされます。

$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の機能ではありません。その機能が呼び出されたときに何を返すのかをモックに伝えます。アサーションはではなく、です。

あなたはメソッドが呼び出されたことを主張したい場合は、私はあなたが呼ばれたのparams保存するためにreturnCallbackを使用することができ、またhttps://github.com/phpspec/prophecy#spies

になり、そしてそのように、あなたはそれがあるべき知っているにそれを比較します次のようなもの:

$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)) - > ..."はまさにそれを行います。しかし、私は " - >期待する(〜で(...))"への私の期待は完全に正しいとは思わなかった。私はコンセッション・コールで何をしようとしていたかを達成することができました。 –

+0

'expects()'は、テストの最後に検証される期待値を設定します。期待はアサーションです。 –

関連する問題