4

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

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

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

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

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

4

1 回答 1

9

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

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

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

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

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

于 2020-05-01T14:29:52.757 回答