Как использовать Mockery для имитации вложенного объекта, такого как запрос GuzzleHttp - PullRequest
0 голосов
/ 16 июня 2020

У меня есть следующий код в 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?

Он должен возвращать Psr7\Response объект GuzzleHttp.

Я знаю, что возвращаемое значение $clientMock должно быть присвоено параметру, но как мне издеваться над

$response->getStatusCode();

и

$response->getBody()->getContents()

Если я собираюсь издеваться над getStatusCode и возвращать 200, я получаю следующую ошибку:

Method Mockery_4_GuzzleHttp_Psr7_Response::getStatusCode() does not exist on this mock object

1 Ответ

1 голос
/ 16 июня 2020

Это не $request, это $response, лучше назовите его так. Очень сбивает с толку тот факт, что переменная $ request содержит объект ответа.

В любом случае,

Mockery::mock(ResponseInterface::class)->shouldReceive('getStatusCode')->andReturn(200);

Если взглянуть на это глубже, вам, вероятно, не нужно заботиться, этот ответ является насмешкой и бесполезен для тестирования , вы будете тестировать, правильно ли настроите макет, а не тестировать свой код.

...