如何使用 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);

更深入地看,您可能不必关心,该响应是模拟的并且无法测试,如果您正确设置模拟,您将在测试,而不是测试您的代码。