当前位置: 首页 > 知识库问答 >
问题:

如何嘲笑Symfony HttpClient作为一个依赖?

龚苏燕
2023-03-14

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

我正在看https://symfony.com/doc/current/components/http_client.html#testing-http-clients-and-responses的留档页面,建议使用$Client=new MockHttpClient($响应);作为创建Mock客户端的一种方式。

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

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

我如何获得一个模拟,将满足打字约束,也允许我模拟响应?

共有1个答案

易祖鹤
2023-03-14

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

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

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

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

这是更干净的(你依赖于抽象,而不是具体),所以ii更容易编写测试。

 类似资料:
  • 我提到了这个答案,我该如何模拟java。时间本地日期。now()关于如何模拟我的LocalDateTime。now()调用。我基本上遵循了所有步骤,但只使用了LocalDateTime而不是LocalDate。 我的代码的功能是这样的,它应该只在一小时的第15或45分钟运行。因此,我将LOCAL\u DATE\u TIME静态变量设置为: 然后在我的@Before测试方法中,我有以下内容: 这是2

  • 由于各种原因,我的单元测试环境无法访问启动ignite所需的环境。我不需要ignite来启动测试,我希望代码忽略对ignite的调用。开始()。我该怎么做? 我尝试过模拟点火,但当我尝试模拟start()方法时,它会抛出一个错误。 这会导致以下错误: 组织。莫基托。例外情况。误用。MissingMethodInvocationException:when()需要的参数必须是“模拟的方法调用”。例如

  • 问题内容: 我在带有打字稿的React Router v5.1.2中使用UseHistory挂钩吗?运行单元测试时,我遇到了问题。 TypeError:无法读取未定义的属性“ history”。 我也尝试使用,但仍然无法正常工作。 问题答案: 浅化使用的反应功能组件时,我需要相同的内容。 在我的测试文件中解决了以下模拟问题:

  • 我也是Mockito和PowerMockito的新手。我发现我无法使用纯Mockito测试静态方法,因此我需要使用PowerMockito(对吗?)。 我有一个非常简单的类,名为Validate,使用这个非常简单的方法 因此,我需要验证: 1) 当我在null message参数上调用该静态方法时,将调用IllegalArgumentException。2)当我在null object参数上调用该

  • 这是这个问题的后续问题。 我的问题是:我将我们的环境升级到了JUnit、Mockito的较新版本……不幸的是,我是用最新的IBM JRE运行本地测试的。然后我们发现,在我们的构建环境中,我们所有的Mockito测试现在都失败了

  • 我读到过嘲弄一切是不好的 测试气味:一切都被嘲弄 嘲弄一切是一个好办法 我还读到单元测试关注单个组件,而集成测试则测试整个系统的协同工作<编写优秀的单元测试:最佳和最差实践 这让我困惑。据我所知,要编写一个合适的单元测试,需要通过模拟除SUT之外的所有组件来隔离单个组件。如果在整个测试过程中使用真实对象,那么该测试不是成为一个集成测试吗? 一个人如何编写一个好的(独立的)单元测试而不去嘲笑一切?