单元测试狂饮HTTP承诺回调

时间:2018-11-08 15:57:18

标签: php phpunit guzzlehttp prophecy

我在课堂上有以下代码:

 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);
}

但是我永远无法使这个测试变成绿色。 andbody是否尝试过类似这种方法来测试异步请求。

关于如何测试该实现的任何想法。

该测试要求响应,告知期望在发布者上调用某个函数失败,如下所示:

No calls have been made that match:

0 个答案:

没有答案