Модульное тестирование жрет http обещает обратные вызовы - PullRequest
0 голосов
/ 08 ноября 2018

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

 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:

...