PHPUnit:将参数传递给mock对象时置位参数

时间:2014-01-17 08:22:29

标签: php unit-testing phpunit

对于以下代码,

$mockObject->expects($this->at(0))
           ->method('search')
           ->with($searchConfig)
           ->will($this->returnValue([]));

此行将自动断言,当它调用方法search时,它必须包含$searchConfig个参数。在这种情况下,我们必须提供完全匹配的$searchConfig,但有时候如果是数组或对象则很难。

有没有办法让PHPUnit调用某个特定的方法断言它包含的参数是否在我们想要的方法中传递?

例如,我可以创建闭包函数来断言如下,而不是使用->with()方法

function ($config){
    $this->assertFalse(isset($config['shouldnothere']));
    $this->assertTrue($config['object']->isValidValue());
}

2 个答案:

答案 0 :(得分:31)

您可以使用->with($this->callback())并传入一个闭包来对参数执行更复杂的断言。

来自PHPUnit Docs

  

callback()约束可用于更复杂的参数   验证。此约束仅将PHP回调作为其回调   论点。 PHP回调将接收要验证的参数   它唯一的参数,如果参数通过则应该返回TRUE   验证,否则为FALSE。

     

示例10.13:更复杂的参数验证

     

getMock('Observer',array('reportError'));

    $observer->expects($this->once())
             ->method('reportError')
             ->with($this->greaterThan(0),
                    $this->stringContains('Something'),
                    $this->callback(function($subject){
                      return is_callable(array($subject, 'getName')) &&
                             $subject->getName() == 'My subject';
                    }));

    $subject = new Subject('My subject');
    $subject->attach($observer);

    // The doSomethingBad() method should report an error to the observer
    // via the reportError() method
    $subject->doSomethingBad();
} } ?>

所以你的测试将成为:

$mockObject->expects($this->at(0))
->method('search')
->with($this->callback(
    function ($config){
        if(!isset($config['shouldnothere']) && $config['object']->isValidValue()) {
            return true;
        }
        return false;
    })
->will($this->returnValue([]));

答案 1 :(得分:0)

您可以使用Mockery

说我有一个密码

$productValidator = app(ProductValidator:class)->setProduct($productIn);

那将是测试代码

use Mockery;

...

    $productValidator            
        ->shouldReceive('setProduct')->once()
        ->with(Mockery::type(Product::class))
        ->with(Mockery::on(function($productIn) use ($productId) {
                return $productIn->id === $productId;
            }))
        ->andReturn($productValidator);

在phpunit“版本”上测试:“ 8.5.8”