私はクラスの単体テストを作成していますが、単体テストFooはかなり新しいです。
私のクラスの重要なコンポーネントは、そのインスタンスにいくつかのオブジェクトBarCollectionが含まれていることです。Barの1つのメソッドはコレクションを反復処理し、コレクション内の各オブジェクトに対してFooいくつかのメソッドを呼び出します。Barスタブオブジェクトを使用して、テストクラスの一連の応答を生成したいと思います。Bar反復するときにスタブクラスが異なる値を返すようにするにはどうすればよいですか?私はこれらの線に沿って何かをしようとしています:
$stubs = array();
foreach ($array as $value) {
$barStub = $this->getMock('Bar');
$barStub->expects($this->any())
->method('GetValue')
->will($this->returnValue($value));
$stubs[] = $barStub;
}
// populate stubs into `Foo`
// assert results from `Foo->someMethod()`
したがってFoo->someMethod()、オブジェクトから受け取った結果に基づいてデータを生成しBarます。ただし、配列が1より大きい場合は常に、次のエラーが発生します。
There was 1 failure:
1) testMyTest(FooTest) with data set #2 (array(0.5, 0.5))
Expectation failed for method name is equal to <string:GetValue> when invoked zero or more times.
Mocked method does not exist.
/usr/share/php/PHPUnit/Framework/MockObject/Mock.php(193) : eval()'d code:25
私が持っていた考えの1つは、コールバックメソッドを呼び出すために使用することでしたが、どのオブジェクトが呼び出しを行っているか(したがって、どのような応答を返すか)を->will($this->returnCallback())コールバックに示す方法がわかりません。Bar
もう1つのアイデアは、onConsecutiveCalls()メソッドなどを使用して、スタブに1回目、2回目などを返すように指示することですが、これを行う方法が正確にはわかりません。また、クラスがコレクションに対して順序付けられた反復以外のことを行った場合、それをテストする方法がないことも心配しています。