如何使用 Mockery 模拟 GuzzleHttp 请求之类的嵌套对象
How To Use Mockery For Mocking Nested Object Like GuzzleHttp Request
我在PHP中有以下代码:
$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);
但是,我应该如何使用 Mockery 来模拟 getStatusCode
?
它应该 return GuzzleHttp
的一个 Psr7\Response
对象。
我知道 $clientMock
return 值应该分配给一个参数,但是我应该如何模拟
$response->getStatusCode();
和
$response->getBody()->getContents()
如果我要模拟 getStatusCode
和 return 200,我会收到以下错误:
Method Mockery_4_GuzzleHttp_Psr7_Response::getStatusCode() does not exist on this mock object
它不是 $request
,它是 $response
,你最好这样命名。 $request 变量包含一个响应对象是非常令人困惑的。
无论如何,
Mockery::mock(ResponseInterface::class)->shouldReceive('getStatusCode')->andReturn(200);
更深入地看,您可能不必关心,该响应是模拟的并且无法测试,如果您正确设置模拟,您将在测试,而不是测试您的代码。
我在PHP中有以下代码:
$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);
但是,我应该如何使用 Mockery 来模拟 getStatusCode
?
它应该 return GuzzleHttp
的一个 Psr7\Response
对象。
我知道 $clientMock
return 值应该分配给一个参数,但是我应该如何模拟
$response->getStatusCode();
和
$response->getBody()->getContents()
如果我要模拟 getStatusCode
和 return 200,我会收到以下错误:
Method Mockery_4_GuzzleHttp_Psr7_Response::getStatusCode() does not exist on this mock object
它不是 $request
,它是 $response
,你最好这样命名。 $request 变量包含一个响应对象是非常令人困惑的。
无论如何,
Mockery::mock(ResponseInterface::class)->shouldReceive('getStatusCode')->andReturn(200);
更深入地看,您可能不必关心,该响应是模拟的并且无法测试,如果您正确设置模拟,您将在测试,而不是测试您的代码。