使用某些参数测试该方法的调用等

时间:2014-03-24 10:47:35

标签: php phpunit

我正在使用phpunit测试方法,我有以下情况:

  • 方法' setParameter'被称为未知的次数
  • 方法' setParameter'用不同类型的参数调用
  • 在各种论证方法' setParameter'必须使用一组参数调用。

我试过这样做:

$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.

1 个答案:

答案 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