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

sci*_*lot 5 php arrays phpunit unit-testing

我正在尝试将预先计算的测试用例数组发送到模拟中,以便在连续调用中返回-与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, $param2, $param3 ], // case 2
       ...
       [ $param1, $param2, $param3 ], // case N
    ];
}
Run Code Online (Sandbox Code Playgroud)

我想使用list()或其他语言中类似“ ...”之类的var-args爆炸性语言构造,从夹具加载器中解构返回的数组,但找不到任何有效的本机。

我确实有种怪异的感觉,我将以最初的回答问答方式发布。我想知道这是否是最好的方法。

sci*_*lot 5

一位朋友提出了PHP 5.6中的替代方案- “splat”运算符或省略号 (...),尽管它在 PHP 中似乎没有正式名称,但它是一种解构形式,类似于Javascript 中的“spread”运算符ES6。

虽然我还没有对此进行测试(因为我的应用程序目前由于环境限制而锁定为 PHP 5.4),但它应该可以简单地工作:

$processorMock
    ->method('process')
    ->willReturnOnConsecutiveCalls(
        ...$fixtureLoader->getProcessorScenarios()
);
Run Code Online (Sandbox Code Playgroud)

这绝对是我一直在寻找的更甜蜜的选择。