我正在为使用HTTP传输层与服务器通信的客户端构建一组单元测试。因为这是我感兴趣的客户端行为,我正在模仿它使用的HTTP传输层实例。因为在PHPUnit中设置模拟是一件痛苦的事情,我在测试类中定义了一些辅助函数来节省我必须为每个测试配置模拟。
<?php
private function mockTransport()
{
$mock = $this->getMock(HTTPClient::class);
$mock->expects($this->any)
->method("send")
->will($this->returnValue($this->mockHTTPResponse));
return $mock
}
private function mockHTTPResponse()
{
$mock = $this->getMock(ResponseInterface::class);
$mock->expects($this->any)
->method("getStatus")
->will($this->returnValue(200)); // HTTP 200 OK
return $mock;
}
这对大多数事情都没问题,除非我在测试代码不是200的情况下进行测试。我本来打算操纵上面帮助方法返回的模拟,但我发现即使我重写再次,它仍然返回相同的响应!
$mock = $this->getMock(ResponseInterface::class);
$mock->expects($this->any)
->method("getStatus")
->will($this->returnValue(200)); // HTTP 200 OK
var_dump ($mock->getStatus()); // 200
$mock->expects($this->any)
->method("getStatus")
->will($this->returnValue(400)); // HTTP 400 bad request
var_dump ($mock->getStatus()); // Still 200!
这意味着如果我需要200响应之外的其他东西,我要么必须a)从头开始构建整个模拟结构(帮助函数首先要避免的颈部剧烈疼痛)或b)将状态代码参数传递给mockResponse()(这对我来说感觉不对,因为测试应该是愚蠢的)。
是否可以重置模拟在最初设置后给予给定方法调用的响应?如果是这样,怎么样?