У меня есть следующий код в классе:
private function makeRequest(DetailedPayload $detailedPayload, $request): void
{
$this->httpClient
->sendAsync($request)
->then(
function (ResponseInterface $response) use ($detailedPayload) {
$this->handleServerResponse($detailedPayload, $response);
},
function (RequestException $exception) use ($detailedPayload) {
$this->logRequestException($detailedPayload, $exception);
}
);
}
Теперь мои функции обработчика выглядят так:
private function handleServerResponse(DetailedPayload $detailedPayload, ResponseInterface $response): void
{
if (200 === $response->getStatusCode()) {
try {
$this->queueDataPublisher->publish($detailedPayload);
} catch (FailedToPublishQueueDataException $exception) {
$this->logPublisherException($detailedPayload, $response);
}
} else {
$this->logNonOkResponse($detailedPayload, $response);
}
}
Теперь я хочу протестировать свой класс с подписью:
public function __construct(Client $httpClient, LoggerInterface $logger, QueueDataPublisher $queueDataPublisher)
Я могу издеваться над всем логгером и классом издателя, а также могу следовать инструкции, чтобы смоделировать http-запрос, как указано в документации по жадности, найденной здесь: http://docs.guzzlephp.org/en/stable/testing.html
Мой тест выглядит следующим образом:
/**
* @test
*
* @throws \Exception
*/
public function willMakeHttpRequestToServer()
{
$client = new Client(
[
'handler' => HandlerStack::create(
new MockHandler(
[
new Response(200)
]
)
)
]
);
$logger = $this->prophesize(LoggerInterface::class);
$queueDataPublisher = $this->prophesize(QueueDataPublisher::class);
$transportClient = new TransportClient($client, $logger->reveal(), $queueDataPublisher->reveal());
$detailedPayload = (new DetailedPayload())
->setStepId('test_step_id')
->setStageId('test_stage_id')
->setProtocolId('test_protocol_id')
->setPayload('test_payload');
$queueDataPublisher
->publish($detailedPayload)
->shouldBeCalled();
$transportClient->sendPayload($detailedPayload);
}
Но я никогда не смогу получить этот тест на зеленый. Кто-нибудь пробовал что-то подобное для проверки асинхронного запроса.
Любая идея о том, как я могу подойти, чтобы проверить эту реализацию.
Тест возвращает ответ, сообщающий, что ожидание вызова функции на издателе не выполнено, так:
No calls have been made that match: