A Guzzle számos olyan eszközt kínál, amelyek segítségével könnyedén leképezheti a HTTP-réteget anélkül, hogy kéréseket kellene küldenie az interneten keresztül.
A HTTP-kliensek tesztelésekor gyakran kell szimulálni bizonyos forgatókönyveket, mint pl. sikeres válasz visszaküldése, hiba visszaküldése, vagy meghatározott válaszok egy bizonyos sorrendben történő visszaadása. Mivel az egységteszteknek kiszámíthatónak, egyszerűnek és indíthatóak és gyorsak legyenek, egy tényleges távoli API elérése egy teszt szagát jelenti.
A Guzzle egy olyan mock kezelőt biztosít, amely a HTTP-kérelmek teljesítésére használható válasz vagy kivétel, a visszatérési értékek sorból való áthelyezésével.
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
Ha nincs több válasz a várólistában, és egy kérés elküldésére kerül sor, akkor egy OutOfBoundsException
hibaüzenetet kap.
Amikor olyan dolgokat használunk, mint a Mock
kezelő, gyakran kell tudnunk, hogy a Mock
kezelőt használjuk-e.
az elvárt kérések pontosan úgy lettek-e elküldve, ahogyan azt terveztük. Míg a mock
kezelő mockolt válaszokkal válaszol, a history middleware fenntartja a
előzményeket az ügyfél által küldött kérésekről.
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.
}
A webszolgáltatás-ügyfél tesztelésekor szinte mindig elegendő a mock-válaszok használata. Egyéni HTTP kezelők implementálásakor a következőkre van szükség tényleges HTTP-kérelmeket kell küldeni a kezelő megfelelő teszteléséhez. A legjobb gyakorlat azonban az, hogy inkább egy helyi webkiszolgálóval lépjen kapcsolatba, mint egy kiszolgálóval az interneten keresztül.
Figyelmeztetés
A következő funkciók a Guzzle fejlesztőinek segítségére szolgálnak
HTTP-kezelők fejlesztéséhez. Nincs ígéret a visszafelé kompatibilitásra
a node.js tesztkiszolgálóval vagy a GuzzleHttp\Tests\Server
osztály. Ha a tesztkiszolgálót vagy a Server
osztályt használja aServer
osztályon kívül.
guzzlehttp/guzzle, akkor be kell állítania az automatikus betöltést és a
biztosítani, hogy a webkiszolgálót manuálisan indítsa el.
Hint
Ezt a teszt webkiszolgálót szinte soha nem kell használni. Mindig csak csak HTTP-kezelők fejlesztésekor érdemes megfontolni a használatát. A teszt webkiszolgáló nem szükséges a kérések mockingjához. Ehhez használja a Mock handler és history middleware-t.
A Guzzle egy node.js tesztkiszolgálóval érkezik, amely fogadja a kéréseket és visszaadja a válaszokat egy várólistáról. A tesztkiszolgáló egy egyszerű API-t tesz közzé, amelyet a következőkre használunk sorba állítani a válaszokat és megvizsgálni a kapott kéréseket.
A Server
objektummal végzett bármely művelet biztosítja, hogy
a kiszolgáló fut, és megvárja, amíg képes lesz kéréseket fogadni, mielőtt a
visszatér.
GuzzleHttp\Tests\Server
egy statikus interfészt biztosít a tesztkiszolgálóhoz. A
sorba állíthat egy HTTP-választ vagy válaszok tömbjét a következő hívással
Server::enqueue()
. Ez a módszer elfogad egy tömbnyi
Psr\Http\Message\ResponseInterface
és Exception
objektumokat.
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
Amikor egy válasz a tesztkiszolgálón sorba kerül, a tesztkiszolgáló eltávolítja az esetleges a korábban sorba állított válaszokat. Ahogy a kiszolgáló megkapja a kérelmeket, a sorba állított válaszok sorba kerülnek, és visszakerülnek a kéréshez. Ha a várólista kiürül, a kiszolgáló 500-as választ küld vissza.
A Server::received()
meghívásával ellenőrizheti a szerver által lekérdezett kéréseket.
foreach (Server::received() as $response) {
echo $response->getStatusCode();
}
A webkiszolgálótól kapott kérések listáját a Server::flush()
módszerrel törölheti.
Server::flush();
echo count(Server::received());
// 0