Testovanie klientov Guzzle

Guzzle poskytuje niekoľko nástrojov, ktoré vám umožnia ľahko zosmiešniť vrstvu HTTP bez toho, aby ste museli posielať požiadavky cez internet.

  • Maketa obsluhy
  • História middleware
  • Webový server Node.js na integračné testovanie

Mock Handler

Pri testovaní klientov HTTP často potrebujete simulovať špecifické scenáre, ako napr. vrátenie úspešnej odpovede, vrátenie chyby alebo vrátenie špecifických odpovede v určitom poradí. Pretože jednotkové testy musia byť predvídateľné, jednoduché zaviesť a byť rýchle, zasiahnutie skutočného vzdialeného rozhrania API je testovacím zápachom.

Guzzle poskytuje mock handler, ktorý možno použiť na splnenie požiadaviek HTTP s odpoveďou alebo výnimkou posunutím návratových hodnôt z frontu.

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

Keď už vo fronte nie sú žiadne odpovede a požiadavka je odoslaná, vyhodí sa OutOfBoundsException.

History Middleware

Pri používaní vecí, ako je Mock, často potrebujete vedieť, či požiadavky, ktoré ste očakávali, že budú odoslané, boli odoslané presne tak, ako ste zamýšľali. Zatiaľ čo mock obsluha odpovedá zosmiešnenými odpoveďami, middleware histórie udržiava históriu požiadaviek, ktoré boli odoslané klientom.

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

Pri testovaní klienta webovej služby takmer vždy stačí použiť makety odpovedí. Pri implementácii vlastných HTTP handlers, budete budete musieť odosielať skutočné požiadavky HTTP, aby ste obsluhu dostatočne otestovali. Najlepším postupom je však kontaktovať skôr miestny webový server ako server cez internet.

  • Testy sú spoľahlivejšie
  • Testy nevyžadujú sieťové pripojenie
  • Testy nemajú žiadne externé závislosti

Používanie testovacieho servera

Upozornenie

Nasledujúca funkcia je určená na pomoc vývojárom aplikácie Guzzle pri vývoji obslužných programov HTTP. Neexistuje žiadny prísľub spätnej kompatibility pokiaľ ide o testovací server node.js alebo GuzzleHttp\Tests\Server trieda. Ak používate testovací server alebo triedu Server mimo guzzlehttp/guzzle, potom budete musieť nakonfigurovať automatické načítanie a zabezpečiť ručné spustenie webového servera.

Nápoveda

Tento testovací webový server takmer nikdy nepotrebujete použiť. Vždy by ste mali používať iba uvažovať o jeho použití pri vývoji obslužných programov HTTP. Testovací webový server nie je potrebný na zosmiešňovanie požiadaviek. Na tento účel použite Mock handler a middleware histórie.

Guzzle sa dodáva s testovacím serverom node.js, ktorý prijíma požiadavky a vracia odpovede z frontu. Testovací server vystavuje jednoduché API, ktoré sa používa na zapisovanie odpovedí do fronty a kontrolu prijatých požiadaviek.

Každá operácia na objekte Server zabezpečí, že server beží a počká, kým bude môcť prijímať požiadavky, a až potom vrátením.

GuzzleHttp\Tests\Server poskytuje statické rozhranie pre testovací server. Môžete môžete zaradiť do frontu odpoveď HTTP alebo pole odpovedí volaním Server::enqueue(). Táto metóda prijíma pole Psr\Http\Message\ResponseInterface a Exception objektov.

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

Keď je odpoveď zaradená do frontu na testovacom serveri, testovací server odstráni všetky predtým zaradené odpovede. Ako server prijíma požiadavky, odpovede zaradené do frontu a vrátia sa späť k požiadavke. Keď je fronta prázdna, server vráti odpoveď 500.

Požiadavky, ktoré server získal, môžete skontrolovať volaním Server::received().

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

Zoznam prijatých požiadaviek z webového servera môžete vymazať pomocou metódy Server::flush().

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