我建立單元測試Foo
類,我是相當新的單元測試的多個存根。PHPUnit的 - 同一類
我班的一個關鍵組件是BarCollection
的一個實例,它包含許多Bar
對象。 Foo
中的一種方法遍歷集合並在集合中的每個對象上調用幾個方法。我想使用存根對象爲我的測試類生成一系列響應。我如何使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,但我不確定如何做到這一點。我還擔心,如果我的課程除了對集合進行有序迭代之外還有其他任何事情,我將無法對其進行測試。
創建我自己的測試課程基本上是我必須做的。在我的例子中,我能夠使用'Bar'類本身,因爲我使用的方法是簡單的getter,但是手工製作的mock類可以使用更復雜的方法。 – keithjgrant 2010-03-30 16:40:16
關於作爲第二個參數傳遞給'getMock()'的有效方法數組:根據文檔,可以省略此參數,並且允許任何方法調用。 – keithjgrant 2010-03-30 16:41:14
這也是我直覺上的理解,但是我確實得到了錯誤,忽略了它,我沒有明確地提到被調用的方法(當然只能與' - > expect()')結合使用;因此提到它。不過,我觀察到的可能是特定版本的bug。但是,無論如何,我很高興您能夠按照您的要求進行測試。 :) – pinkgothic 2010-03-30 20:55:10