双倍杠杆/模拟客户端

模拟客户端的简单方法

v4.1.4 2023-10-24 15:01 UTC

README

Packagist Version Packagist Downloads

模拟客户端

此包可以帮助测试依赖于HTTP调用的客户端组件。目前只支持Guzzle客户端。

安装

通过Composer

$ composer require doppiogancio/mocked-client guzzlehttp/guzzle php-http/discovery

需求

此版本需要至少PHP版本8.1

如何模拟客户端

use DoppioGancio\MockedClient\HandlerBuilder;
use DoppioGancio\MockedClient\ClientBuilder;
use DoppioGancio\MockedClient\Route\RouteBuilder;
use GuzzleHttp\Psr7\Response;
use Http\Discovery\Psr17FactoryDiscovery;
use Psr\Log\NullLogger;

$handlerBuilder = new HandlerBuilder(
    Psr17FactoryDiscovery::findServerRequestFactory(),
    new NullLogger()
);

$route = new RouteBuilder(
    Psr17FactoryDiscovery::findResponseFactory(),
    Psr17FactoryDiscovery::findStreamFactory(),
);

// Route with Response
$handlerBuilder->addRoute(
    $route->new()
        ->withMethod('GET')
        ->withPath('/country/IT')
        ->withResponse(new Response(200, [], '{"id":"+39","code":"IT","name":"Italy"}'))
        ->build()
);


$clientBuilder = new ClientBuilder($handlerBuilder);
$client = $clientBuilder->build();

高级示例

  1. 使用文件的路由
  2. 使用字符串的路由
  3. 使用连续调用的路由
  4. 使用回调的路由
  5. 带有中间件的Guzzle客户端

如何使用客户端

$response = $client->request('GET', '/country/DE/json');
$body = (string) $response->getBody();
$country = json_decode($body, true);

print_r($country);

// will return
Array
(
    [id] => +49
    [code] => DE
    [name] => Germany
)

一些建议...

快速失败,频繁失败

如果您事先不知道需要哪些路由,请不要担心,从没有路由的客户端开始,让它建议添加哪些路由。

$handlerBuilder = new HandlerBuilder(
    Psr17FactoryDiscovery::findServerRequestFactory(),
    new NullLogger()
);

// don't add any route for now...

$clientBuilder = new ClientBuilder($handlerBuilder);
$client = $clientBuilder->build();

运行测试:测试将失败,但会建议缺少的路由。这样做,它只会指定所需的路线。

示例

DoppioGancio\MockedClient\Exception\RouteNotFound: Mocked route GET /admin/dashboard not found

将客户端注入服务容器

如果您有服务容器,请将客户端添加到其中,这样每个依赖于它的服务都能够自动绑定。

self::$container->set(Client::class, $client);

// In Symfony
self::$container->set('eight_points_guzzle.client.my_client', $client);