PHPUnit :将参数传递给模拟对象时断言参数

2022-08-30 17:00:33

对于下面的代码,

$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());
}

答案 1

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

来自 PHPUnit 文档

回调() 约束可用于更复杂的参数验证。此约束采用 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([]));

答案 2

你可以使用嘲笑它

假设我有代码

$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 “version” 上测试: “8.5.8”


推荐