php - 如何将 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:传递给的参数 3
App\Allocator\Strategy\AbstractStrategy::__construct()
必须是 的实例Symfony\Component\HttpClient\HttpClient
,Symfony\Component\HttpClient\MockHttpClient
接收的实例。
如何获得满足打字约束并允许我模拟响应的 Mock?
解决方案
你不应该依赖Symfony\Component\HttpClient
,而应该依赖Symfony\Contracts\HttpClient\HttpClientInterface
。
MockHttpClient
实现了该接口,因此在这种情况下它是注入的有效替代品。
如果你注入HttpClient
,因为你想使用工厂在运行时创建任意客户端,模拟会更难。但这不太可能是您真正想要的。
集成 Http 客户端的正确方法是对接口进行类型提示,并让框架根据您的配置实例化适当的客户端。
那更简洁(您依赖于抽象而不是具体),因此 ii 更容易为其编写测试。
推荐阅读
- spring - 从 java 代码在 xero 中创建联系人会产生错误的请求
- postgresql-12 - 如何在 Ubuntu Desktop 20.04 LTS 上安装 PostGIS
- mysql - 如何在MYSQL数据库中存储列表
- elasticsearch - Elasticsearch 分片和副本搜索性能
- angular9 - 在Angular 9中是否有正确的方法来做routerLink?
- javascript - 如何遍历嵌套的 iframe?
- javascript - 如何同步x轴到窗口的变化
- python - 给定数字中的最大可能数字。(替代),贪心算法
- django - 两个同名的 Django 应用
- pytorch - 如何用 2D 掩码掩盖 3D 张量并保持原始向量的尺寸?