我正在使用phpunit测试方法,我有以下情况:
我试过这样做:
$mandatoryParameters = array('param1', 'param2', 'param3');
foreach ($mandatoryParameters as $parameter) {
$class->expects($this->once())
->method('setParameter')
->with($parameter);
}
不幸的是,测试失败了,因为在使用这些参数调用方法之前,它也会被其他参数调用。我得到的错误是:
Parameter 0 for invocation Namespace\Class::setParameter('random_param', 'random_value')
does not match expected value.
Failed asserting that two strings are equal.
答案 0 :(得分:1)
尝试使用$this->at()
方法。你每次用你的循环覆盖你的模拟。
$mandatoryParameters = array('param1', 'param2', 'param3');
$a = 0;
foreach ($mandatoryParameters as $parameter) {
$class->expects($this->at($a++);
->method('setParameter')
->with($parameter);
}
这会将模拟设置为期望setParameter
被调用一定次数,并且每个调用将使用不同的参数。您需要知道哪个呼叫特定于您的参数,并相应地调整数量。如果调用不是顺序调用,则可以为每个参数设置一个索引。
$mandatoryParameters = array(2 =>'param1', 5 => 'param2', 6 => 'param3');
foreach ($mandatoryParameters as $index => $parameter) {
$class->expects($this->at($index);
->method('setParameter')
->with($parameter);
}
索引为零,所以请记住从0而不是1开始计数。
http://phpunit.de/manual/current/en/phpunit-book.html#test-doubles.mock-objects.tables.matchers