Php 如何将Symfony HttpClient模拟为依赖关系?

Php 如何将Symfony HttpClient模拟为依赖关系?,php,symfony,testing,symfony4,symfony-http-client,Php,Symfony,Testing,Symfony4,Symfony Http Client,我有一个类,我将Symfony\Component\HttpClient\HttpClient的实例作为构造函数参数注入其中 我正在查看文档页面,其中建议使用$client=newmockhttpclient($responses)作为创建模拟客户端的一种方式 当我将模拟客户端传递给我的类时,我得到错误: TypeError:传递给App\Allocator\Strategy\AbstractStrategy::\uu construct()的参数3必须是Symfony\Component\Ht

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

我正在查看文档页面,其中建议使用
$client=newmockhttpclient($responses)作为创建模拟客户端的一种方式

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

TypeError:传递给
App\Allocator\Strategy\AbstractStrategy::\uu construct()
的参数3必须是
Symfony\Component\HttpClient\HttpClient
的实例,接收到的
Symfony\Component\HttpClient\MockHttpClient
的实例


如何获得满足键入约束并允许模拟响应的模拟?

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

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

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

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

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