PHPUnit检查方法使用多个参数多次调用

时间:2014-07-24 10:52:31

标签: phpunit

我有以下课程:

class Foo
{
    public function importBars(array $array)
    {
        foreach ($array as $key => $value) {
            $this->importBar($key, $value);
        }
    }

    public function importBar($key, $value)
    {
        // do stuff
    }
}

我需要测试importBar被称为count($array)次,是否使用正确的参数调用它。使用$this->at()不是一种选择,因为$array元素的顺序可能会发生变化。我有:

public function testImportBars(array $array)
{
    // Mock invocation ...
    $logicalOrs = array();
    foreach ($array as $sku => $value) {
        $logicalOrs[] = $this->logicalOr($this->equalTo($key), $this->equalTo($value));
    }

    $mock->expects($this->exactly(count($array)))
        ->method('importBar')
        ->with(call_user_func_array(array($this, 'logicalOr'), $logicalOrs));
}

通过测试。但是,当我故意让它失败时:

foreach ($array as $sku => $value) {
    $logicalOrs[] = $this->logicalOr($this->equalTo($key), $this->equalTo(null));
}

......它仍然过去了。仅在$key不正确时才会失败:

foreach ($array as $sku => $value) {
    $logicalOrs[] = $this->logicalOr($this->equalTo(null), $this->equalTo(null));
}

...这表明PHPUnit只检查传递给Foo::importBar()的第一个参数是否正确。

当有多个方法时,有没有办法告诉PHPUnit验证方法的参数?

1 个答案:

答案 0 :(得分:0)

经过一些反复试验,这是我提出的最接近的解决方案:

$rows = array();
foreach ($array as $key => $value) {
    $rows[] = array($key, $value);
}

$method = $mock->expects($this->exactly(count($array)))
        ->method('importBar');

call_user_func_array(array($method, 'withConsecutive'), $rows);  

请参阅:http://phpunit.de/manual/4.1/en/test-doubles.html#test-doubles.mock-objects