Guzzle:在功能测试中模拟外部调用?

时间:2016-11-22 09:22:29

标签: mocking phpunit symfony guzzle

我目前正在使用Guzzle开发Symfony3项目。我的项目调用了几个外部API,我想在我的功能测试中模拟这些请求。

Guzzle documentation,似乎要遵循的方法是使用模拟处理程序和历史中间件。然而,我很惊讶没有针对这个常见任务的内置解决方案(或者至少,我没有找到它)。

我期望的是用以下内容编写我的测试:

$mockedClient = new MockedClient([
    ['GET', '/foo', 200, 'Hello world!'],
    ['GET', '/bar', 200, 'Hello another world!'],
]);

$mockedClient->verify();

您使用的是哪种解决方案? :)

2 个答案:

答案 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服务器并模拟/检查其中的所有请求。