如何在链接的模拟方法上断言输入

时间:2020-07-17 09:13:44

标签: php unit-testing phpunit

我正在使用PHPunit 8.3.5,我正在尝试检查方法是否获得了正确的参数。

示例代码:

$this->registry->get($thing)->apply(EXAMPLE::SUBMIT);
$this->registry->get($thing)->apply(EXAMPLE::CANCEL);

我有两个函数,functionA使用第一个示例行,functionB使用第二个示例行。我需要确保functionA使用SUBMIT而不是其他任何东西,对于Bs情况也是如此。

问题:

  • 我可以将->method('apply')->with()与回调一起使用,以测试是否可以正确输入
  • 我可以为willReturn创建一个->method('get')->with()来返回一个以apply作为函数的简单类
  • 我不知道如何结合两者
$registryMock = $this->createMock(Registry::class);
$registryMock->method('get')->willReturn(new class {
    public function apply(){} // <-- I need to assert the input of this method
});
$registryMock->method('apply')->with(self::callback(function($order, $status){
    return $status === EXAMPLE::SUBMIT;
}));

如何结合这两种方法?我也尝试过get->apply,但这不是它。
请注意:不能重写实际代码。

1 个答案:

答案 0 :(得分:1)

基于Dirk的评论:

您可以像通常那样首先在第二个函数中创建一个模拟。然后,您创建一个模拟,该模拟返回前一个模拟:

// first we create a mock for the last in the chain, here '->apply()'
$registryMockApply = $this->createMock(Registry::class);
$registryMockApply->expects(self::once())->method('apply')->with(
    self::equalTo(EXAMPLE::SUBMIT),
);

// Then the one before that, here '->get()', which returns the previous mock
$registryMock = $this->createMock(Registry::class);
$registryMock->method('get')->willReturn($registryMockApply);

// Together resulting in '->get()->apply()'