ikwattro/guzzle-stereo

Guzzle Recorder 用于记录请求/响应并在模拟中回放

1.4.0 2016-10-23 11:32 UTC

This package is not auto-updated.

Last update: 2024-09-10 04:01:03 UTC


README

轻松记录和回放 HTTP 响应。

Build Status

需求

  • PHP 5.6+
  • Guzzle 6

安装

需要 composer 包

composer require ikwattro/guzzle-stereo

注意:如果你使用 Symfony 框架,可以查看 @estahn 的GuzzleStereoBundle

基础

录制器

录制器是了解磁带及其存储方式的主要对象。

磁带

磁带将记录 Response 对象。它有一个名称,可以具有 filters。一个过滤器可以告诉例如,只有状态码为 200 的响应将被记录在该磁带上。

定义磁带和过滤器是通过一个 yaml 文件定义完成的

tapes:
	my_tape:
		filters:
			status_code: 200

这个磁带将只记录成功响应。

过滤器

过滤器是一个 rule,告诉是否包含 Response 对象。库中提供了一些内置的过滤器,你也可以创建自己的并注册它们。

注意:如果你觉得你的过滤器足够通用,不要犹豫,直接提交一个 PullRequest

存储目录

为了稍后回放(见下面的回放部分),所有磁带都将随后以 json 文件的形式写入磁盘。你需要提供一个可写目录。

播放器

播放器可以将导出的 json 文件作为 Response 对象回放。一个很好的用例是在你的测试套件中使用 Mock Handler 回放它们。

用法

录制

通过提供可写存储目录和你的磁带定义文件的位置来实例化录制器

require_once(__DIR__.'/vendor/autoload.php');

use Ikwattro\GuzzleStereo\Recorder;

$recorder = new Recorder(__DIR__.'/var/records', __DIR__.'/stereo.yml');

接下来,当创建你的 Guzzle 客户端时,你需要让它知道录制器。一个简单的方法是使用库中可用的中间件

$stack = \GuzzleHttp\HandlerStack::create();
$stack->push(\Ikwattro\GuzzleStereo\RecorderMiddleware::record($recorder));

$client = new \GuzzleHttp\Client(['handler' => $stack]);

现在你可以像往常一样使用客户端进行 http 请求,例如,这里我们将调用 GitHub 事件 API 10 次

for ($i = 0; $i < 10; $i++) {
	try {
		$client->get('https://api.github.com/events');
	} catch (RequestException $e) {
		// Do what you want
	}
}

最后,你需要告诉录制器将磁带转储到磁盘

$recorder->dump();

在提供的存储目录中创建一个名为 record_ + {tape_name} 的文件,包含通过过滤器的响应

回放

为了回放记录的磁带,你可以使用 Player。实际上,播放器创建了一个 Mock Handler,并返回一个包含磁带文件中响应的 GuzzleHttp\Client 实例。

use Ikwattro\GuzzleStereo\Player;

$player = Player::replayFromTape('/path/to/tape.json');

$player->get('/');
// will return you the first response record present in the tape

过滤器参考

StatusCode

仅当响应具有相应的状态码时才包含响应。

tapes:
	my_tape:
		filters:
			status_code: 200

非空体

仅当体不为空时才包含响应。

tapes:
	my_tape:
		filters:
			non_empty_body: ~

有头

仅当包含指定键的头时才包含响应。

tapes:
	my_tape:
		filters:
			has_header: "Content-Type"

创建自己的过滤器

创建一个过滤器非常简单。你需要创建一个实现 Ikwattro\GuzzleStereo\Filter\FilterInterface 的过滤器类,并声明两个方法

  • public static function getName()
  • public function isIncluded(ResponseInterface $response)

getName 静态函数负责定义磁带中的过滤器名称。

isIncluded 函数将包含确定接收到的 Response 是否应包含在磁带中的逻辑。

以下示例过滤器将接收来自Github事件API的响应,并且只有当正文包含由您在将过滤器关联到磁带时作为参数传递的Github用户执行的事件时,才会记录它。

<?php
namespace Acme\MyApp\Filter;

use Ikwattro\GuzzleStereo\Filter\FilterInterface;
use Psr\Http\Message\ResponseInterface;

class ActorFilter implements FilterInterface
{
	const FILTER_NAME = "actor_filter";
	
	protected $users;
	
	public function__construct(array $users = array())
	{
		$this->users = $users;
	}
	
	public static function getName()
	{
		return self::FILTER_NAME;
	}
	
	public function isIncluded(ResponseInterface $response)
	{
		$body = json_decode((string) $response->getBody());
		foreach ($body as $event) {
			$actor = $event['actor']['login'];
			if (in_array($actor, $this->users)) {
				return true;
			}
		}
		
		return false;
	}
}

您现在可以在配置中添加自定义过滤器,并在磁带中使用它。

custom_filters:
	- "Acme\MyApp\Filter\ActorFilter"
	- 
tapes:
	my_tape:
		filters:
			actor_filter: ["jexp","ikwattro","luanne"]

您的磁带现在将只包含包含提供的演员之一作为其演员之一的响应。

额外配置设置

您可以通过设置以下配置标志使您的响应对象包含特定头作为标记

marker_header: true

这将添加一个具有true值的X-Guzzle-Stereo头。

待办事项

  • 更多过滤器
  • 黑名单
  • 空磁带
  • 更好的配置管理(可能是Symfony配置组件)
  • 组合requestAndResponses
  • 过滤播放器应返回的内容
  • 你的想法?

测试

使用phpspecphpunit进行测试

./vendor/bin/phpspec run -f pretty
./vendor/bin/phpunit

许可

该库采用MIT许可发布,请参阅随软件包提供的LICENSE文件。

贡献

请随意在Github上贡献或报告问题。

作者

Christophe Willemsen

Twitter: @ikwattro

Github: @ikwattro