【问题标题】:Guzzle: mocking external calls in functional tests?Guzzle:在功能测试中模拟外部调用?
【发布时间】:2021-08-19 19:07:54
【问题描述】:

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

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

我的期望是用类似这样的方式编写测试:

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

$mockedClient->verify();

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

【问题讨论】:

  • 是的,我过去在一些功能测试中使用过文档中描述的方法。当您配置预期响应时,您可以将其作为依赖项传递给被测服务(或覆盖容器中定义的 guzzle),然后照常使用。如果您需要更多信息,请告诉我

标签: mocking phpunit symfony guzzle


【解决方案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);
    }

祝你好运, 阿诺

【讨论】:

    【解决方案2】:

    另外,看看PHPUnit HTTP mock 项目。它非常适合真正的验收测试,你想测试你的应用程序几乎不受影响(无需修改代码,可能只是小的配置更改)。在内部,可以通过创建一个小型独立 HTTP 服务器并模拟/检查其中的所有请求。

    【讨论】:

    • 我看到了这个工具,但它不能满足我的需要。我们已经进行了一些 E2E 测试来确定全球乐观行为。然而,我想模拟请求以测试一些边缘情况。 :)
    • 好的!但是你看过这里的例子吗:github.com/InterNations/http-mock/blob/master/doc/start.md?您可以模拟远程服务器的几乎所有参数,例如响应状态代码、响应正文甚至响应生成时间。不知道你的边缘情况,但我用这个工具测试:)
    猜你喜欢
    • 2019-08-06
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2016-06-01
    • 2021-03-28
    • 2019-07-27
    • 2022-11-22
    相关资源
    最近更新 更多