首页 > 解决方案 > 如何将 Symfony HttpClient 模拟为依赖项?

问题描述

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?

标签: phpsymfonytestingsymfony4symfony-http-client

解决方案


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

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

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

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

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


推荐阅读