【问题标题】:PHPUnit check method invoked multiple times with multiple parameters使用多个参数多次调用 PHPUnit 检查方法
【发布时间】:2014-07-25 18:34:03
【问题描述】:

我有以下课程:

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 验证方法的参数?

【问题讨论】:

    标签: phpunit


    【解决方案1】:

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

    $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

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 2012-06-12
      • 2021-11-01
      • 2020-02-17
      • 2013-05-05
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2011-04-18
      相关资源
      最近更新 更多