我试图将预先计算的测试用例数组发送到一个模拟中,以便在连续调用时返回 – 类似于map函数.但是它需要一个参数列表,而不是一个数组.
我想要做的就是这样,但当然这会导致它在第一次调用时返回整个数组.
// In a test case: $processorMock ->method('process') ->willReturnOnConsecutiveCalls( $fixtureLoader->getProcessorScenarios() // how to explode this? ); // class FixtureLoader pseudocode: function getProcessorScenarios(){ return [ [ $param1,$param2,$param3 ],// case 1 [ $param1,// case 2 ... [ $param1,// case N ]; }
我想从夹具加载器中构造返回的数组,使用list()或一些var-args爆炸语言构造,如“…”在其他语言中,但找不到任何有效的本机.
解决方法
我发现的方法是使用call_user_func_array函数将数组扩展为参数.
call_user_func_array( [$processorMock->method('process'),'willReturnOnConsecutiveCalls'],$fixtureLoader->getProcessorScenarios());
这感觉很讨厌,打破了模拟的流畅定义.我猜它会有一些缺点,例如未来的脆弱性.
更新:
我发现我需要在asserts中包含一些参数,因为它们是更复杂的类型,例如类.
// class FixtureLoader pseudocode: function getProcessorScenarios(){ $param1 = PHPUnit_Framework_Assert::isinstanceOf('MyApp\Model\Thingumy'); $param1 = PHPUnit_Framework_Assert::isinstanceOf('MyApp\Model\Whatsit'); return [ [ $param1,$param2c1,$param2c2,$param2c3,// case N ]; }