jshayes / fake-requests
一个简化使用guzzle进行测试的包。
Requires
- guzzlehttp/guzzle: ^6.3
- illuminate/support: ^6.0
- phpunit/phpunit: ~8.0
Requires (Dev)
- orchestra/testbench: ^4.0
- satooshi/php-coveralls: ^1.0
- squizlabs/php_codesniffer: ^3.0
This package is auto-updated.
Last update: 2024-09-16 13:12:41 UTC
README
fake-requests
一个简化使用guzzle进行测试的简单包
基本用法
您可以为MockHandler
注册预期的调用。mock处理程序有针对每种http请求类型的方法。
use JSHayes\FakeRequests\MockHandler; use JSHayes\FakeRequests\ClientFactory; public function test() { $factory = new ClientFactory(); $factory->setHandler($mockHandler = new MockHandler()); $mockHandler->get('/get-request'); $mockHandler->post('/post-request'); $factory->make()->get('/get-request'); $factory->make()->post('/post-request'); }
此简单示例创建了两个预期。第一个是一个带有URL路径/get-request
的GET
请求。第二个是一个带有URL路径/post-request
的POST
请求。然后从工厂中解析出客户端,并为每个预期执行GET
和POST
请求。
可以使用ClientFactory
来解析guzzle客户端实例。您可以将处理程序绑定到工厂,以便在解析guzzle客户端时,将默认处理程序与您指定的处理程序交换。如果您正在使用HandlerStack
,它还将保留注册的中间件。
一旦满足预期,它将从处理程序中删除。因此,如果您两次执行相同的请求,则必须添加两个单独的预期。
您还可以使用以下替代语法
use JSHayes\FakeRequests\MockHandler; use JSHayes\FakeRequests\ClientFactory; public function test() { $factory = new ClientFactory(); $factory->setHandler($mockHandler = new MockHandler()); $mockHandler->expects('get', '/get-request'); $mockHandler->expects('post', '/post-request'); $factory->make()->get('/get-request'); $factory->make()->post('/post-request'); }
此示例设置了与上面示例相同的预期。
您还可以在uri中指定主机,而不仅仅是路径。这可以确保在您与多个远程服务通信时,正确地击中了服务。
use JSHayes\FakeRequests\MockHandler; use JSHayes\FakeRequests\ClientFactory; public function test() { $factory = new ClientFactory(); $factory->setHandler($mockHandler = new MockHandler()); $mockHandler->expects('get', 'https://test.dev/get-request'); $factory->make()->get('https://test.dev/get-request'); }
检查请求
如果您需要对创建的请求或提供的选项进行断言,您可以使用inspectRequest
方法。此方法将\Psr\Http\Message\RequestInterface
的实例作为第一个参数。
$mockHandler->get('/get-request')->inspectRequest(function (RequestInterface $request, array $options) { // Make assertions on the request or options here });
或者,您可以使用getRequest
方法在处理之后从RequestHandler
获取请求。此请求是\JSHayes\FakeRequests\Request
的实例,它位于\Psr\Http\Message\RequestInterface
周围。此装饰器公开了一些断言辅助函数。有关一些示例,请参阅以下内容
$expectation = $mockHandler->get('/get-request'); $factory->make()->get('/get-request'); $request = $expectation->getRequest(); $request->assertBodyEquals('');
请注意,请求为null,直到被处理程序处理。
扩展请求
如果您想向请求添加一些自定义辅助方法,可以使用extendRequest
方法来扩展请求。此方法接受一个字符串,该字符串是您要使用的请求类名称。此扩展请求类必须扩展JSHayes\FakeRequests\Request
。由于JSHayes\FakeRequests\Request
类扩展了PHPUnit\Framework\Assert
,因此您的扩展请求类将有权访问PHPUnit的断言方法。
例如,您可以创建一个类似于以下内容的扩展请求
use JSHayes\FakeRequests\Request; class ExtendedRequest extends Request { /** * This is an example method in an extended request. These extended requests * can be used to add assertion helpers to make testing request flows easier * * @return void */ public function assertExample(): void { $this->assertTrue(true); } }
此扩展请求可以按以下方式使用
// Register the extended request with the mock handler $mockHandler->extendRequest(ExtendedRequest::class); $expectation = $mockHandler->get('/get-request'); $factory->make()->get('/get-request'); // Getting the request from the expectation will return the extended request $request = $expectation->getRequest(); $request->assertExample();
或者,如果您不想扩展mock处理程序处理的每个请求,您可以在请求处理程序本身上扩展请求。
$expectation1 = $mockHandler->get('/get-request1')->extendRequest(ExtendedRequest::class); $expectation2 = $mockHandler->get('/get-request2'); $factory->make()->get('/get-request1'); $factory->make()->get('/get-request2'); // Getting the request from the expectation will return the extended request $request = $expectation1->getRequest(); $request->assertExample(); // Getting the request for the second expectation will not return the extended request, since // we only extended the request on the first expectation. So, the assertExample method will // not be available here. $request->expectation2->getRequest();
自定义响应
有几种方法可以为每个预期创建自定义响应。当您创建自定义响应时,该响应将在请求预期满足时返回给guzzle客户端。以下三种自定义响应的方法。
第一种方法是通过传递请求参数。第一个参数是状态码。第二个是响应体。第三个是添加到响应中的头数组。
$mockHandler->get('/test')->respondWith(200, 'body', ['header' => 'value]);
第二种方法是通过创建实现\Psr\Http\Message\ResponseInterface
的请求。
$mockHandler->get('/test')->respondWith(new Response(200, ['header' => 'value'], 'body'));
第三种方法是传递一个回调给respondWith
。这个回调将接收一个\JSHayes\FakeRequests\ResponseBuilder
实例。
$mockHandler->get('/test')->respondWith(function (ResponseBuilder $builder) { $builder->status(200); $builder->body('body'); $builder->headers(['header' => 'values']); });
控制处理器何时处理
如果您想更多地控制RequestHandler
何时处理特定的请求,可以使用when
方法。这个方法将\Psr\Http\Message\RequestInterface
实例作为第一个参数接收。
$mockHandler->get('/test')->when(function (RequestInterface $request, array $options) { return true; });
处理器只有在方法和uri匹配,并且when
回调返回true时才会处理请求。
允许意外调用
有时您可能希望当MockHandler
收到它未预期的端点调用时,不要引发错误。在这种情况下,您可以在MockHandler
上使用allowUnexpectedCalls
方法。
$mockHandler->allowUnexpectedCalls(); $client->get('/test');
在这个例子中,对/test
的GET
请求将返回一个通用的200响应。
使用Laravel进行测试
这个包还附带了一个特质,使使用Laravel进行测试变得容易一些。
use JSHayes\FakeRequests\Traits\Laravel\FakeRequests; class SomeTest extends TestCase { use FakeRequests; /** * @test */ public function some_test() { $handler = $this->fakeRequests(); // Add expectations to the handler } }
在这个例子中,fakeRequests
方法为您创建了MockHandler
。它还将它绑定到ClientFactory
,并将ClientFactory
实例绑定到IOC。如果您在代码中从IOC解析ClientFactory
,这个特质将允许您轻松地在所有guzzle客户端实例中使用MockHandler
。