Php 如何使用mockry模拟嵌套对象(如GuzzleHttp请求)
我有以下PHP代码:Php 如何使用mockry模拟嵌套对象(如GuzzleHttp请求),php,unit-testing,guzzle,mockery,psr-7,Php,Unit Testing,Guzzle,Mockery,Psr 7,我有以下PHP代码: $response = $this->client->request('GET', $path, $requestBody, $headers); $isRequestSuccess = $response->getStatusCode() === "200"; if ($isRequestSuccess) { return $response->getBody()->getContents(); } 我似乎成功地为请求创建了一个模
$response = $this->client->request('GET', $path, $requestBody, $headers);
$isRequestSuccess = $response->getStatusCode() === "200";
if ($isRequestSuccess) {
return $response->getBody()->getContents();
}
我似乎成功地为请求创建了一个模拟:
$mockResponse = \Mockery::mock('GuzzleHttp\Psr7\Response');
$clientMock
->shouldReceive('request')
->once()
->withAnyArgs()
->andReturn($mockResponse);
$clientMock->shouldReceive('getStatusCode')->andReturn(200);
但是,我应该如何使用mockry来模拟getStatusCode
它应该返回GuzzleHttp的Psr7\响应对象
我知道$clientMock返回值应该分配给一个参数,但是我应该如何模拟
$response->getStatusCode();
及
如果要模拟getStatusCode并返回200,则会出现以下错误:
Method Mockery_4_GuzzleHttp_Psr7_Response::getStatusCode() does not exist on this mock object
这不是一个$request,而是一个$response,您最好这样命名。$request变量包含一个response对象,这非常令人困惑
反正
Mockery::mock(ResponseInterface::class)->shouldReceive('getStatusCode')->andReturn(200);
更深入地看,您可能不必在意,响应是模拟的,测试没有用,如果您正确设置了模拟,您将进行测试,而不是测试代码。您的示例仅适用于getStatusCode方法,但不一定适用于$response->getBody->getContents。我不是在嘲笑整个函数的响应。我想模拟它在其中调用的方法,因为它是嵌套验证整个代码的一部分。还添加了错误。我认为这是我的错。我只是在回答中犯了一个错误。我没有添加makePartial调用。啊,sry,您必须模拟StreamInterface并让其getContents方法返回预期的字符串,然后配置响应模拟的getBody方法以返回模拟的流。
Mockery::mock(ResponseInterface::class)->shouldReceive('getStatusCode')->andReturn(200);