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.
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
.
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.
}
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.
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