عند اختبار واجهات برمجة تطبيقات الطرف الثالث، غالبًا ما يكون من الصعب الاستهزاء بها بطريقة بسيطة وتصريحية. تهدف هذه الحزمة إلى المساعدة في جعل هذه العملية أكثر بساطة من خلال توفير معالج مخصص لـ 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']
في بعض الأحيان يكون من المفيد إجراء تأكيدات على الطلب الذي أعاد ردك. ربما لديك فصل دراسي يقوم بتسجيل الدخول إلى واجهة برمجة تطبيقات تابعة لجهة خارجية، وتريد التأكد من إرسال اسم المستخدم وكلمة المرور بشكل صحيح.
$ 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.