Guzzle tarjoaa useita työkaluja, joiden avulla voit helposti pilkata HTTP-kerrosta ilman, että sinun tarvitsee lähettää pyyntöjä internetin kautta.
HTTP-asiakkaita testattaessa on usein simuloitava tiettyjä skenaarioita, kuten seuraavia. onnistuneen vastauksen palauttaminen, virheen palauttaminen tai tietynlaisen vastauksia tietyssä järjestyksessä. Koska yksikkötestien on oltava ennakoitavissa, helppo käynnistettäviä ja nopeita, todellisen etä-API:n käyttäminen on testin haju.
Guzzle tarjoaa mock-käsittelijän, jota voidaan käyttää HTTP-pyyntöjen täyttämiseen vastauksella tai poikkeuksella siirtämällä paluuarvoja pois jonosta.
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
Kun jonossa ei ole enää vastauksia ja pyyntö lähetetään, OutOfBoundsException
heitetään.
Kun käytät esimerkiksi Mock
-käsittelijää, sinun on usein tiedettävä, onko
odotetut pyynnöt lähetettiin juuri niin kuin halusit. Vaikka mock
käsittelijä vastaa jäljitellyillä vastauksilla, historia-väliohjelmisto ylläpitää
historiaa asiakkaan lähettämistä pyynnöistä.
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.
}
Verkkopalveluasiakkaan testauksessa riittää lähes aina vastausten jäljittely. Kun toteutat mukautettuja HTTP-käsittelijöitä, sinun täytyy on lähetettävä todellisia HTTP-pyyntöjä, jotta käsittelijää voidaan testata riittävästi. Paras käytäntö on kuitenkin ottaa yhteyttä paikalliseen web-palvelimeen eikä palvelimeen Internetin kautta.
Varoitus
Seuraavat toiminnot auttavat Guzzlen kehittäjiä.
kehittää HTTP-käsittelijöitä. Yhteensopivuutta taaksepäin ei ole luvattu.
node.js:n testipalvelimen tai GuzzleHttp\Tests\Server
osalta.
luokka. Jos käytät testipalvelinta tai Server
-luokkaa muualla kuin osoitteessa
guzzlehttp/guzzle, sinun on määritettävä automaattinen lataus ja
varmistaa, että verkkopalvelin käynnistetään manuaalisesti.
Vihje
Tätä testiverkkopalvelinta ei juuri koskaan tarvitse käyttää. Sinun pitäisi aina vain harkita sen käyttöä vain HTTP-käsittelijöitä kehitettäessä. Testiverkkopalvelin ei ole välttämätön pyyntöjen pilkkomiseen. Käytä siihen Mock-käsittelijää ja historian väliohjelmistoa.
Guzzlen mukana toimitetaan node.js testipalvelin, joka vastaanottaa pyyntöjä ja palauttaa vastauksia jonosta. Testipalvelin tarjoaa yksinkertaisen API:n, jota käytetään seuraaviin tarkoituksiin jonottaa vastauksia ja tarkastaa vastaanottamansa pyynnöt.
Kaikki Server
-objektiin kohdistuvat operaatiot varmistavat, että
että palvelin on käynnissä ja odottaa, kunnes se pystyy vastaanottamaan pyyntöjä ennen kuin
paluuta.
GuzzleHttp\Tests\Server
tarjoaa staattisen rajapinnan testipalvelimelle. Sinä
voit asettaa jonoon HTTP-vastauksen tai joukon vastauksia kutsumalla kutsua
Server::enqueue()
. Tämä metodi hyväksyy joukon
Psr\Http\Message\ResponseInterface
ja Exception
-objekteja.
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
Kun vastaus asetetaan jonoon testipalvelimella, testipalvelin poistaa kaikki mahdolliset aiemmin jonossa olleet vastaukset. Kun palvelin vastaanottaa pyyntöjä, jonossa olevat vastaukset poistetaan jonosta ja palautetaan pyyntöön. Kun jono on tyhjä, palvelin palauttaa 500-vastauksen.
Voit tarkastella pyyntöjä, jotka palvelin on hakenut kutsumalla Server::received()
.
foreach (Server::received() as $response) {
echo $response->getStatusCode();
}
Voit tyhjentää web-palvelimen vastaanottamien pyyntöjen luettelon Server::flush()
-menetelmällä.
Server::flush();
echo count(Server::received());
// 0