Saat menguji API pihak ketiga, sering kali sulit untuk meniru API tersebut dengan cara yang sederhana dan deklaratif. Paket ini bertujuan untuk membantu membuat proses ini lebih sederhana dengan menyediakan penangan khusus untuk membuang waktu yang memiliki perilaku seperti router, daripada mengandalkan respons yang dikeluarkan dari tumpukan dalam urutan tertentu.
Anda dapat menginstal paket melalui composer:
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']
Terkadang berguna untuk melakukan pernyataan pada permintaan yang mengembalikan respons Anda. Mungkin Anda memiliki kelas yang masuk ke API pihak ketiga, dan Anda ingin memastikan nama pengguna dan kata sandi dikirimkan dengan benar.
$ 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 '
]
]);
Catatan: Anda juga dapat melakukan pernyataan yang sama persis menggunakan ->assertRequestHeaders()
, ini akan memungkinkan Anda memastikan permintaan API berisi header X-API-KEY
atau sejenisnya.
Menegaskan isi atau header mungkin tidak cukup, jadi kami mengizinkan Anda memanggil ->withAssertion()
, meneruskan objek permintaan dan respons, sehingga Anda dapat melakukan pernyataan Anda sendiri:
$ 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 ' );
Terkadang berguna untuk menegaskan bahwa panggilan API dilakukan dalam urutan yang benar. Mungkin Anda harus menelepon /login
sebelum mengambil /users
misalnya. Hal ini dicapai dengan memberi nama pada tanggapan Anda, kemudian menegaskan urutannya setelah panggilan Anda dilakukan.
$ 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 '
]);
Terkadang Anda mungkin hanya ingin mengizinkan titik akhir dipanggil satu kali dalam pengujian Anda - ini dapat dicapai dengan memanggil ->once()
pada objek respons Anda.
$ 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
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.
Paket ini dibuat menggunakan Paket PHP Boilerplate.