微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将一组测试用例发送到PHPUnit willReturnOnConsecutiveCalls

我试图将预先计算的测试用例数组发送到一个模拟中,以便在连续调用时返回 – 类似于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爆炸语言构造,如“…”在其他语言中,但找不到任何有效的本机.

我确实感觉像一个hacky方法,我将作为一个初始答案Q& A风格发布.我想知道这是不是最好的方法.

解决方法

我发现的方法是使用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
    ];
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐