เมื่อทดสอบ API ของบุคคลที่สาม มักจะเป็นเรื่องท้าทายที่จะจำลอง API ด้วยวิธีที่เรียบง่ายและชัดเจน แพคเกจนี้มีจุดมุ่งหมายเพื่อช่วยทำให้กระบวนการนี้ง่ายขึ้นโดยการจัดหาตัวจัดการที่กำหนดเองสำหรับ guzzle ที่มีพฤติกรรมเหมือนเราเตอร์ แทนที่จะอาศัยการตอบสนองที่โผล่ออกมาจากสแต็กในลำดับเฉพาะใดๆ
คุณสามารถติดตั้งแพ็คเกจผ่านทางผู้แต่ง:
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']
บางครั้งการยืนยันคำขอที่ส่งคืนคำตอบของคุณก็มีประโยชน์ บางทีคุณอาจมีคลาสที่ล็อกอินเข้าสู่ API ของบุคคลที่สาม และคุณต้องการยืนยันชื่อผู้ใช้และรหัสผ่านที่ถูกส่งผ่านอย่างถูกต้อง
$ 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 '
]
]);
หมายเหตุ: คุณยังสามารถดำเนินการยืนยันแบบเดียวกันได้โดยใช้ ->assertRequestHeaders()
ซึ่งจะช่วยให้คุณมั่นใจได้ว่าคำขอ API มีส่วนหัว X-API-KEY
หรือคล้ายกัน
การยืนยันเนื้อหาหรือส่วนหัวอาจไม่เพียงพอ ดังนั้นเราจึงอนุญาตให้คุณโทร ->withAssertion()
โดยส่งออบเจ็กต์คำขอและการตอบกลับไปให้คุณ เพื่อให้คุณสามารถดำเนินการยืนยันของคุณเองได้:
$ 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 ' );
บางครั้งการยืนยันการเรียก API ตามลำดับที่ถูกต้องก็มีประโยชน์ บางทีคุณอาจต้องโทร /login
ก่อนที่จะดึงข้อมูล /users
เป็นต้น ซึ่งทำได้โดยการตั้งชื่อให้กับการตอบกลับของคุณ จากนั้นยืนยันคำสั่งซื้อหลังจากที่คุณโทรออกแล้ว
$ 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 '
]);
บางครั้งคุณอาจต้องการอนุญาตให้มีการเรียกปลายทางเพียงครั้งเดียวในการทดสอบของคุณ ซึ่งสามารถทำได้โดยการเรียก ->once()
บนออบเจ็กต์การตอบสนองของคุณ
$ 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
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม
แพ็คเกจนี้สร้างขึ้นโดยใช้ PHP Package Boilerplate