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.
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
.
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.
}
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.
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();
echo count(Server::received());
// 0