Testování klientů Guzzle

Guzzle poskytuje několik nástrojů, které vám umožní snadno zesměšnit vrstvu HTTP, aniž byste museli posílat požadavky přes internet.

  • Maketa obsluhy
  • Historický middleware
  • Webový server Node.js pro integrační testování

Mock Handler

Při testování klientů HTTP je často třeba simulovat specifické scénáře, jako např. vrácení úspěšné odpovědi, vrácení chyby nebo vrácení specifických odpovědí. odpovědi v určitém pořadí. Protože jednotkové testy musí být předvídatelné, snadné. a rychlé, je testování skutečného vzdáleného rozhraní API cítit z testů.

Guzzle poskytuje mock handler, který lze použít k plnění požadavků HTTP s odpovědí nebo výjimkou posunutím návratových hodnot z fronty.

use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Exception\RequestException;

// Create a mock and queue two responses.
$mock = new MockHandler([
    new Response(200, ['X-Foo' => 'Bar'], 'Hello, World'),
    new Response(202, ['Content-Length' => 0]),
    new RequestException('Error Communicating with Server', new Request('GET', 'test'))
]);

$handlerStack = HandlerStack::create($mock);
$client = new Client(['handler' => $handlerStack]);

// The first request is intercepted with the first response.
$response = $client->request('GET', '/');
echo $response->getStatusCode();
//> 200
echo $response->getBody();
//> Hello, World
// The second request is intercepted with the second response.
echo $client->request('GET', '/')->getStatusCode();
//> 202

// Reset the queue and queue up a new response
$mock->reset();
$mock->append(new Response(201));

// As the mock was reset, the new response is the 201 CREATED,
// instead of the previously queued RequestException
echo $client->request('GET', '/')->getStatusCode();
//> 201

Pokud ve frontě nejsou žádné další odpovědi a je odeslán požadavek, je vyhozena OutOfBoundsException.

Historický middleware

Při používání věcí, jako je Mock handler, často potřebujete vědět, zda je požadavky, které jste očekávali, že budou odeslány, byly odeslány přesně tak, jak jste zamýšleli. Zatímco mock obslužný program odpovídá zesměšněnými odpověďmi, middleware historie si udržuje historii požadavků, které byly klientem odeslány.

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;

$container = [];
$history = Middleware::history($container);

$handlerStack = HandlerStack::create();
// or $handlerStack = HandlerStack::create($mock); if using the Mock handler.

// Add the history middleware to the handler stack.
$handlerStack->push($history);

$client = new Client(['handler' => $handlerStack]);

$client->request('GET', 'http://httpbin.org/get');
$client->request('HEAD', 'http://httpbin.org/get');

// Count the number of transactions
echo count($container);
//> 2

// Iterate over the requests and responses
foreach ($container as $transaction) {
    echo $transaction['request']->getMethod();
    //> GET, HEAD
    if ($transaction['response']) {
        echo $transaction['response']->getStatusCode();
        //> 200, 200
    } elseif ($transaction['error']) {
        echo $transaction['error'];
        //> exception
    }
    var_dump($transaction['options']);
    //> dumps the request options of the sent request.
}

Testovací webový server

Při testování klienta webové služby téměř vždy stačí použít makety odpovědí. Při implementaci vlastních HTTP handlers, budete muset potřebujete odeslat skutečné požadavky HTTP, abyste mohli obsluhu dostatečně otestovat. Osvědčeným postupem je však kontaktovat spíše místní webový server než server přes internet.

  • Testy jsou spolehlivější
  • Testy nevyžadují připojení k síti
  • Testy nemají žádné externí závislosti

Použití testovacího serveru

Varování

Následující funkce slouží vývojářům systému Guzzle jako pomůcka pro vyvíjet obslužné programy HTTP. Není přislíbena zpětná kompatibilita. pokud jde o testovací server node.js nebo GuzzleHttp\Tests\Server. třída. Pokud používáte testovací server nebo třídu Server mimo třídu guzzlehttp/guzzle, pak budete muset nakonfigurovat automatické načítání a zajistit ruční spuštění webového serveru.

Nápověda

Tento testovací webový server téměř nikdy nepotřebujete použít. Vždy byste měli používat pouze uvažovat o jeho použití při vývoji obslužných programů HTTP. Testovací webový server není pro posměšné požadavky nutný. K tomu použijte Mock handler a middleware historie.

Guzzle je dodáván s testovacím serverem node.js, který přijímá požadavky a vrací je. odpovědi z fronty. Testovací server vystavuje jednoduché API, které se používá k zapisovat odpovědi do fronty a kontrolovat přijaté požadavky.

Jakákoli operace s objektem Server zajistí, že. server je spuštěn a počká, dokud nebude schopen přijímat požadavky, a teprve potom vrátí.

GuzzleHttp\Tests\Server poskytuje statické rozhraní k testovacímu serveru. Na adrese můžete zařadit do fronty odpověď HTTP nebo pole odpovědí voláním Server::enqueue(). Tato metoda přijímá pole Psr\Http\Message\ResponseInterface a Exception objektů.

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Tests\Server;

// Start the server and queue a response
Server::enqueue([
    new Response(200, ['Content-Length' => 0])
]);

$client = new Client(['base_uri' => Server::$url]);
echo $client->request('GET', '/foo')->getStatusCode();
// 200

Když je odpověď zařazena do fronty na testovacím serveru, testovací server odstraní všechny dříve zařazené odpovědi do fronty. Jak server přijímá požadavky, odpovědi zařazené do fronty a jsou vráceny zpět k požadavku. Když je fronta prázdná, server vrátí odpověď 500.

Požadavky, které server získal, můžete zkontrolovat voláním Server::received().

foreach (Server::received() as $response) {
    echo $response->getStatusCode();
}

Seznam přijatých požadavků z webového serveru můžete vymazat pomocí metody Server::flush().

Server::flush();
echo count(Server::received());
// 0