我有一个类,其中将Symfony\Component\HttpClient\HttpClient
的实例作为构造函数参数注入其中。
我正在查看https://symfony.com/doc/current/components/http_client.html#testing-http-clients-and-responses处的文档页面,建议使用$client = new MockHttpClient($responses);
作为创建Mock客户端的方法。
当我将模拟的客户端传递给我的班级时,出现错误:
TypeError:传递给
App\Allocator\Strategy\AbstractStrategy::__construct()
的参数3必须是Symfony\Component\HttpClient\HttpClient
的实例,已接收到Symfony\Component\HttpClient\MockHttpClient
的实例。
我如何获得一个满足输入约束并且还可以模拟响应的模拟物?
您不应该依赖Symfony\Component\HttpClient
,而要依赖Symfony\Contracts\HttpClient\HttpClientInterface
。
MockHttpClient
实现了该接口,因此在这种情况下,它是注入的有效替代。
如果注入HttpClient
,因为要使用工厂在运行时创建任意客户端,模拟将变得更加困难。但是,这不太可能是您真正想要的。
集成Http客户端的正确方法是通过接口的类型提示,然后让框架根据您的配置实例化相应的客户端。
这更干净(您依赖于抽象而不是具体的东西,因此ii为其编写测试要容易得多。