Laravel макет нескольких конечных точек Guzzle - PullRequest
1 голос
/ 22 января 2020

Я использую Laravel 6 и пытаюсь проверить конечную точку. Конечная точка делает 2 запроса к внешним API (от moll ie). В настоящее время я делаю это так:

Abstract BaseMollieEndpointTest

<?php

namespace Tests;

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;
use Mollie\Api\MollieApiClient;

abstract class BaseMollieEndpointTest extends TestCase
{
    /**
     * @var Client|\PHPUnit_Framework_MockObject_MockObject
     */
    protected $guzzleClient;

    /**
     * @var MollieApiClient
     */
    protected $apiClient;

    protected function mockApiCall(Response $response)
    {
        $this->guzzleClient = $this->createMock(Client::class);

        $this->apiClient = new MollieApiClient($this->guzzleClient);

        $this->apiClient->setApiKey('test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM');

        $this->guzzleClient
            ->expects($this->once())
            ->method('send')
            ->with($this->isInstanceOf(Request::class))
            ->willReturnCallback(function (Request $request) use ($response) {
                return $response;
            });
    }
}

Все мои тесты происходят от этого абстрактного класса. И я реализую это так:

public function test()
{
    $this->mockApiCall(
        new Response(
            200,
            [],
            '{
              "response": "here is the response",
            }'
        )
    );

    Mollie::shouldReceive('api')
        ->once()
        ->andReturn(new MollieApiWrapper($this->app['config'], $this->apiClient));

    dd(Mollie::api()->customers()->get('238u3n'));
}

Это работает. Но проблема в том, что когда мне нужно смоделировать другие запросы в тот же вызов API, я получаю тот же результат обратно.

Так как же я могу убедиться, что могу высмеять 2 ответа (вместо 1) и вернуть их для определенного c URL?

1 Ответ

1 голос
/ 23 января 2020

Взгляните на отличную библиотеку Guzzler для имитации HTTP-вызовов, а также на MockHandler с промежуточным программным обеспечением истории .

Отвечая на ваш конкретный вопрос, с помощью Guzzler это может быть простым, как:

$this->guzzler->expects($this->exactly(2))
    ->endpoint("/send", "POST")
    ->willRespond($response)
    ->willRespond(new Response(409));
...