【问题标题】:How to mock the Symfony HttpClient as a dependecy?如何将 Symfony HttpClient 模拟为依赖项?
【发布时间】:2020-05-01 13:06:24
【问题描述】:

我有一个类,我将Symfony\Component\HttpClient\HttpClient 的实例作为构造函数参数注入其中。

我正在查看https://symfony.com/doc/current/components/http_client.html#testing-http-clients-and-responses 的文档页面,建议使用$client = new MockHttpClient($responses); 作为创建模拟客户端的一种方式。

当我将模拟的客户端传递给我的班级时,我得到了错误:

TypeError: 传递给 App\Allocator\Strategy\AbstractStrategy::__construct() 的参数 3 必须是 Symfony\Component\HttpClient\HttpClient 的实例,收到了 Symfony\Component\HttpClient\MockHttpClient 的实例。

如何获得满足打字约束并允许我模拟响应的 Mock?

【问题讨论】:

    标签: php symfony testing symfony4 symfony-http-client


    【解决方案1】:

    你不应该依赖Symfony\Component\HttpClient,而应该依赖Symfony\Contracts\HttpClient\HttpClientInterface

    MockHttpClient 实现了该接口,因此在这种情况下它是注入的有效替代。

    如果你注入HttpClient,因为你想使用工厂在运行时创建任意客户端,那么模拟会更难。但这不太可能是你真正想要的。

    集成 Http 客户端的正确方法是对接口进行类型提示,并让框架根据您的配置实例化适当的客户端。

    这样更简洁(您依赖于抽象而不是具体),因此 ii 更容易为其编写测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 2021-12-13
      • 1970-01-01
      • 2016-09-16
      • 2020-12-09
      相关资源
      最近更新 更多