如何将 Symfony HttpClient 模拟为依赖项?
How to mock the Symfony HttpClient as a dependecy?
我有一个 class,我向其中注入了一个 Symfony\Component\HttpClient\HttpClient
的实例作为构造函数参数。
我正在查看位于 https://symfony.com/doc/current/components/http_client.html#testing-http-clients-and-responses 的文档页面,其中建议使用 $client = new MockHttpClient($responses);
作为创建 Mock 客户端的方法。
当我将模拟客户端传递给我的 class 时,出现错误:
TypeError: Argument 3 passed to App\Allocator\Strategy\AbstractStrategy::__construct()
must be an instance of Symfony\Component\HttpClient\HttpClient
, instance of Symfony\Component\HttpClient\MockHttpClient
received.
如何获得满足键入约束并允许我模拟响应的 Mock?
你不应该依赖 Symfony\Component\HttpClient
,而应该依赖 Symfony\Contracts\HttpClient\HttpClientInterface
。
MockHttpClient
实现了该接口,因此在这种情况下它是注入的有效替代。
如果你注入 HttpClient
,因为你想在运行时使用工厂创建任意客户端,模拟会更难。但这不太可能是您真正想要的。
集成 Http 客户端的正确方法是通过接口类型提示,并让框架根据您的配置实例化适当的客户端。
这更清晰(您依赖于抽象而不是具体化),因此 ii 更容易为其编写测试。
我有一个 class,我向其中注入了一个 Symfony\Component\HttpClient\HttpClient
的实例作为构造函数参数。
我正在查看位于 https://symfony.com/doc/current/components/http_client.html#testing-http-clients-and-responses 的文档页面,其中建议使用 $client = new MockHttpClient($responses);
作为创建 Mock 客户端的方法。
当我将模拟客户端传递给我的 class 时,出现错误:
TypeError: Argument 3 passed to
App\Allocator\Strategy\AbstractStrategy::__construct()
must be an instance ofSymfony\Component\HttpClient\HttpClient
, instance ofSymfony\Component\HttpClient\MockHttpClient
received.
如何获得满足键入约束并允许我模拟响应的 Mock?
你不应该依赖 Symfony\Component\HttpClient
,而应该依赖 Symfony\Contracts\HttpClient\HttpClientInterface
。
MockHttpClient
实现了该接口,因此在这种情况下它是注入的有效替代。
如果你注入 HttpClient
,因为你想在运行时使用工厂创建任意客户端,模拟会更难。但这不太可能是您真正想要的。
集成 Http 客户端的正确方法是通过接口类型提示,并让框架根据您的配置实例化适当的客户端。
这更清晰(您依赖于抽象而不是具体化),因此 ii 更容易为其编写测试。