我目前正在使用Guzzle开发Symfony3项目。我的项目调用了几个外部API,我想在我的功能测试中模拟这些请求。
看Guzzle documentation,似乎要遵循的方法是使用模拟处理程序和历史中间件。然而,我很惊讶没有针对这个常见任务的内置解决方案(或者至少,我没有找到它)。
我期望的是用以下内容编写我的测试:
$mockedClient = new MockedClient([
['GET', '/foo', 200, 'Hello world!'],
['GET', '/bar', 200, 'Hello another world!'],
]);
$mockedClient->verify();
您使用的是哪种解决方案? :)
答案 0 :(得分:1)
由于没有合适的Symfony Guzzle包装,确实非常棘手
以下是我在其最新版本中使用Guzzle模拟功能的方法(它在最新的Guzzle版本中有所改变,过去更简单!!):
首先,我设计我的服务以注入Guzzle客户端(通过扩展GuzzleHttp \ Client的第二个服务):
my_guzzleclient:
class: ...MyGuzzleClient
my_service:
class: ...MyService
arguments: ['@my_guzzleclient']
然后,在我的测试中,我创建了一个模拟处理程序:
$mock = new MockHandler([
new Response(200, array(), array())
]);
最后,我用一个新的自定义guzzle客户端(my_guzzleclient)来覆盖我的模拟处理程序
$client->getContainer()->set('my_guzzleclient', new MyGuzzleClient($mock));
以下是MyGuzzleClient的代码
use GuzzleHttp\Client as BaseClient
class MyGuzzleClient extends BaseClient
{
/**
* MyGuzzleClient constructor.
* @param bool|MockHandler $handler
*/
public function __construct($handler = false)
{
$options = array();
if ($handler !== false) {
$options['handler'] = $handler;
}
parent::__construct($options);
}
祝你好运,
阿诺
答案 1 :(得分:1)
另外,看看PHPUnit HTTP mock项目。它非常适合真正的验收测试,你想要在不受影响的情况下测试你的应用程序(无需修改代码,只需更改小配置)。在内部,可以通过创建一个小型独立HTTP服务器并模拟/检查其中的所有请求。