PHPUnit期望使用一个参数调用 - 更详细地描述参数

时间:2018-01-19 15:42:14

标签: php phpunit

我有以下phpunit mock:

    $this->httpClient->expects($this->at(1))->method('send')
        ->with($this->isInstanceOf(RequestInterface::class))
        ->willReturn($responseMock);

所以"发送"的参数""正在检查的方法函数调用必须是RequestInterface的一个实例。但是我需要更详细地检查这个参数:

  • 它必须是RequestInterface
  • 实例的对象
  • " url"对象的属性需要具有一定的值(例如" https://some-domain.com")
  • 对象的方法必须是' GET'

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以使用PHPUnit的callback constraint为您的断言添加自定义逻辑,例如

$this->httpClient
    ->expects($this->at(1))->method('send')
    ->with($this->callback(function (RequestInterface $request) {
        $this->assertSame('https://some-domain.com', $request->getUri());
        $this->assertSame('GET', $request->getMethod());

        return true;
    }))
    ->willReturn($responseMock);

如果传递的对象应该被认为是有效的,回调应该返回true,但是你也可以在其中使用本机断言(assertSame等) - 它们抛出的任何异常都会冒泡到测试本身。这里的instanceof检查由回调上的类型提示处理,因为如果它不匹配则会引发TypeError。如果您愿意,也可以省略类型提示并手动运行assertInstanceOf

(注意:我已经假设你在这里使用了PSR-7 RequestInterface - 显然回调中的方法名称如果没有则需要更改。)