如何将Symfony HttpClient模拟为依赖项?

问题描述 投票:1回答:1

我有一个类,其中将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的实例。

我如何获得一个满足输入约束并且还可以模拟响应的模拟物?

php symfony testing symfony4 symfony-http-client
1个回答
1
投票

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

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

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

集成Http客户端的正确方法是通过接口的类型提示,然后让框架根据您的配置实例化相应的客户端。

这更干净(您依赖于抽象而不是具体的东西,因此ii为其编写测试要容易得多。

© www.soinside.com 2019 - 2024. All rights reserved.