jshayes/fake-requests

一个简化使用guzzle进行测试的包。

v3.0 2020-01-16 02:52 UTC

This package is auto-updated.

Last update: 2024-09-16 13:12:41 UTC


README

Build Status Coverage Status

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-requestGET请求。第二个是一个带有URL路径/post-requestPOST请求。然后从工厂中解析出客户端,并为每个预期执行GETPOST请求。

可以使用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');

在这个例子中,对/testGET请求将返回一个通用的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