타사 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 호출이 올바른 순서로 이루어졌다고 주장하는 것이 유용한 경우가 있습니다. 예를 들어 /users
가져오기 전에 /login
호출해야 할 수도 있습니다. 이는 응답에 이름을 지정한 다음 호출이 이루어진 후 순서를 주장함으로써 달성됩니다.
$ 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 라이센스(MIT). 자세한 내용은 라이센스 파일을 참조하십시오.
이 패키지는 PHP 패키지 보일러플레이트를 사용하여 생성되었습니다.