Модульное тестирование жрет http обещает обратные вызовы

У меня есть следующий код в классе:

 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:

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector