如何将 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 更容易为其编写测试。