我正在为 class 构建单元测试Foo
,而且我对单元测试还很陌生。
我的类的一个关键组件是一个BarCollection
包含许多Bar
对象的实例。一个方法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
但是,只要数组长于一个,这就会给我以下错误:
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
我的一个想法是用来->will($this->returnCallback())
调用回调方法,但我不知道如何向回调指示哪个Bar
对象正在进行调用(以及因此给出什么响应)。
另一个想法是使用该onConsecutiveCalls()
方法或类似方法来告诉我的存根第一次返回 1,第二次返回 2,等等,但我不确定如何执行此操作。我还担心,如果我的班级除了对集合进行有序迭代之外的任何事情,我将无法测试它。