1

どうしてこれなの:

 $mock = $this->getMock("EventDispatcher");
 $mock->expects($this->once())->method("fireEvent");

以下と同じではありません:

$mock = $this->getMock("EventDispatcher")->expects($this->once())->method("fireEvent");

両方を組み合わせて試しました

Yii::app()->setComponent("dispatch",$mock);

最初は動作しますが、最後は致命的なエラーになります:

致命的なエラー: タイプ PHPUnit_Framework_MockObject_Builder_InvocationMocker のオブジェクトを /var/www/frameworks/yii/base/CModule.php の 438 行で配列として使用できません

これら 2 つのことは同じ結果になると思いますか、それとも頭が完全に崩壊した瞬間にこのコードを書いただけなのでしょうか?

4

1 に答える 1

2
$mock = $this->getMock("EventDispatcher");

この最初の呼び出しは、実際のモック オブジェクトを返します。

$mock->expects($this->once())->method("fireEvent");

この行は、PHPUnit が提供する流暢なインターフェースを利用して、モックから必要な動作を構築します。ここでは、どの変数にも割り当てられていないため、実際には戻り値の型を使用していませんが、それを見ると、 type であることがわかりますPHPUnit_Framework_MockObject_Builder_InvocationMocker。これにより、次のような追加の動作を連鎖させることができます

$mock->expects($this->once())
     ->method("fireEvent")
     ->with($this->equalTo('expectedParam'))
    ;

2番目の例:

$mock = $this->getMock("EventDispatcher")
                 ->expects($this->once())
                 ->method("fireEvent")
    ;

は同じ方法でモックを作成しますが、メソッドが 1 行で連結されているため、モック自体にアクセスする方法はありません。このようにメソッド呼び出しを連鎖させたときの動作は、最後の呼び出しの戻り値が割り当てられた値になるというものですが、示されているように、これはPHPUnit_Framework_MockObject_Builder_InvocationMocker. 実際のモックは への呼び出しによって返されますが、 への呼び出しでは返されgetMock()ませんmethod()

于 2013-08-06T20:31:52.117 に答える