Beim Testen von APIs von Drittanbietern ist es oft schwierig, sie auf einfache und deklarative Weise zu simulieren. Dieses Paket soll dazu beitragen, diesen Prozess zu vereinfachen, indem es einen benutzerdefinierten Handler für Guzzle bereitstellt, der sich wie ein Router verhält, anstatt sich darauf zu verlassen, dass die Antworten in einer bestimmten Reihenfolge vom Stapel entfernt werden.
Sie können das Paket über Composer installieren:
composer require tomb1n0/guzzle-mock-handler
use GuzzleHttp Client ;
use Tomb1n0 GuzzleMockHandler GuzzleMockHandler ;
// Create a new instance of the mock handler
$ handler = new GuzzleMockHandler ;
// Create a new mock response for '/login', returning ['key' => 'value'] in the body.
// By default responses expect a GET verb, and return a 200 response.
$ loginResponse = ( new GuzzleMockResponse ( ' /login ' ))-> withBody ([
' key ' => ' value '
]);
// Tell the handler that we're expecting this response
$ handler -> expect ( $ loginResponse );
// Create a new Guzzle Handlerstack, passing in our custom handler
$ stack = HandlerStack :: create ( $ handler );
// Finally, create the guzzle client, passing our stack in
$ guzzle = new Client ([ ' handler ' => $ stack ]);
$ response = $ guzzle -> get ( ' /login ' );
// A normal guzzle response object
$ response -> getStatusCode (); // == 200
json_decode (( string ) $ response -> getBody ()); // == ['key' => 'value']
Manchmal ist es nützlich, Behauptungen für die Anfrage auszuführen, die Ihre Antwort zurückgegeben hat. Vielleicht haben Sie eine Klasse, die sich bei einer Drittanbieter-API anmeldet, und Sie möchten sicherstellen, dass der Benutzername und das Passwort korrekt gesendet wurden.
$ handler = new GuzzleMockHandler ;
$ loginResponse = ( new GuzzleMockResponse ( ' /login ' ))
-> withMethod ( ' post ' )
-> assertRequestJson ([
' username ' => ' tomb1n0 ' ,
' password ' => ' correct-horse-battery-staple '
]);
// NOTE: If you only care about the username in this case, you can pass in a key as the second parameter to assertRequestJson like so:
/**
* ->assertRequestJson('tomb1n0, 'username');
**/
$ handler -> expect ( $ loginResponse );
$ stack = HandlerStack :: create ( $ handler );
$ guzzle = new Client ([ ' handler ' => $ stack ]);
// Just before the response is actually sent back to guzzle, our handler will assert the request JSON is corect.
$ response = $ guzzle -> post ( ' /login ' , [
' json ' => [
' username ' => ' tomb1n0 ' ,
' password ' => ' correct-horse-battery-staple '
]
]);
Hinweis: Sie können genau dieselben Behauptungen auch mit ->assertRequestHeaders()
ausführen. Dadurch können Sie sicherstellen, dass API-Anfragen einen X-API-KEY
-Header oder ähnliches enthalten.
Das Assertieren des Hauptteils oder der Header reicht möglicherweise nicht aus. Daher können Sie ->withAssertion()
aufrufen und Ihnen die Anforderungs- und Antwortobjekte übergeben, damit Sie Ihre eigenen Assertionen durchführen können:
$ handler = new GuzzleMockHandler ;
$ loginResponse = ( new GuzzleMockResponse ( ' /login ' ))
-> withMethod ( ' post ' )
// if you want to perform multiple assertions, you can call -> withAssertion multiple times.
-> withAssertion ( function ( RequestInterface $ request , ResponseInterface $ response ) {
$ this -> assertEquals ( ' super-secure-key ' , $ request -> getHeader ( ' X-API-KEY ' ));
});
$ handler -> expect ( $ loginResponse );
$ stack = HandlerStack :: create ( $ handler );
$ guzzle = new Client ([ ' handler ' => $ stack ]);
$ guzzle -> post ( ' /login ' );
Manchmal ist es nützlich, sicherzustellen, dass API-Aufrufe in der richtigen Reihenfolge durchgeführt wurden. Möglicherweise müssen Sie /login
aufrufen, bevor Sie beispielsweise /users
abrufen. Dies erreichen Sie, indem Sie Ihren Antworten einen Namen geben und dann die Reihenfolge bestätigen, nachdem Ihre Anrufe getätigt wurden.
$ handler = new GuzzleMockHandler ;
$ loginResponse = ( new GuzzleMockResponse ( ' /login ' ))-> withMethod ( ' post ' );
$ usersResponse = new GuzzleMockResponse ( ' /users ' );
$ handler -> expect ( $ loginResponse , ' login-response ' );
$ handler -> expect ( $ usersResponse , ' users-response ' );
$ stack = HandlerStack :: create ( $ handler );
$ guzzle = new Client ([ ' handler ' => $ stack ]);
$ guzzle -> post ( ' /login ' );
$ guzzle -> get ( ' /users ' );
// Performs a assertsEquals behind the scenes, as the handler keeps track of the order calls were made in.
$ handler -> assertCalledOrder ([
' login-response ' , ' users-response '
]);
Manchmal möchten Sie möglicherweise zulassen, dass ein Endpunkt in Ihren Tests nur einmal aufgerufen wird. Dies können Sie erreichen, indem Sie ->once()
für Ihr Antwortobjekt aufrufen.
$ handler = new GuzzleMockHandler ;
$ loginResponse = ( new GuzzleMockResponse ( ' /login ' ))
-> withMethod ( ' post ' )
-> once ();
$ handler -> expect ( $ loginResponse );
$ stack = HandlerStack :: create ( $ handler );
$ guzzle = new Client ([ ' handler ' => $ stack ]);
$ response = $ guzzle -> post ( ' /login ' ); // successfull
$ response = $ guzzle -> post ( ' /login ' ); // ResponseNotFound exception is thrown, "No response set for post => /login"
composer test
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.
Dieses Paket wurde mit dem PHP Package Boilerplate generiert.