Mockery を使用して、例外がスローされたときにメソッドが別のメソッド内から呼び出されることをアサートしようとしています。例として:
public function testOtherMethodIsCalled() {
$client = m::mock('Client');
$client
->shouldReceive('getFoo')
->andThrow(new FooNotAvailableException);
$controller = m::mock('Controller[otherMethod]');
$controller
->shouldReceive('otherMethod')
->once();
$controller->setClient($client);
$controller->firstMethod();
}
明らかに名前は簡略化されていますが、それは私が持っているものと他のすべての点で同じです。コードでは、FooNotAvailableException
がキャッチされると、 への呼び出しを返しますotherMethod()
。
問題は、実行すると次のエラーが発生することです。
Mockery\CountValidator\Exception: Controller のメソッド otherMethod() は、正確に 1 回呼び出す必要がありますが、0 回呼び出す必要があります。
これは、元のモックされていないものが内部的にotherMethod()
呼び出されているためです。テスト内から呼び出すとしたら、次のようになります。
$controller->otherMethod();
テストに合格します。
それはなぜですか? また、テストしたい内容のテストをどのように作成すればよいでしょうか?