如何模拟 Symfony HttpClient 作为依赖?

And*_*ndy 4 php testing symfony symfony4 symfony-http-client

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

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

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

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

我如何获得一个满足输入约束并允许我模拟响应的 Mock?

yiv*_*ivi 5

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

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

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

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

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