【问题标题】:How to handle lots of `mockImplentationOnce` calls如何处理大量“mockImplementationOnce”调用
【发布时间】:2019-10-04 05:19:31
【问题描述】:

我正在为一个有很多请求的类编写集成测试。请求是通过 HttpClient 单例完成的。

所以,为了避免发出真正的请求,我模拟了对HttpClient 的所有调用。问题是,我的请求太多了。

  1. 调用HttpClient.get 来获取令牌。
  2. 调用HttpClient.get 来获取资源。
  3. 调用 HttpClient.get 以从该资源中获取所有客户。
  4. 调用HttpClient.get 以验证另一个 API 中是否存在单个客户。
  5. 条件:调用HttpClient.post 将这个客户添加到 API(如果它不存在)。
  6. 调用 HttpClient.post 将资源添加到另一个 API。

实际上比这要复杂一些,因为其中一些调用是多次完成的(在循环内),但你明白了。

我为每个场景编写了一个测试用例。一个测试用例模拟失败的获取令牌的请求,另一个模拟失败的获取资源的请求等等。

为此,我使用mockImplementationOnce 编写了一个“快乐”场景——一切顺利——。我的beforeEach 看起来有点像这样:

tokenResponse = { body: { token: 'some-token'}, status: 200 }
HttpClient.get.mockImplementationOnce(() => tokenResponse)
tokenResource = { body: <some-fixture-with-resources>, status: 200 }
HttpClient.get.mockImplementationOnce(() => tokenResource
(...)

为了编写场景,我重新分配了返回的变量

it('fails to fetch the token', () => {
  tokenResponse = { status: 500 }

  // code that calls my class
  // code that asserts that an error was thrown
}

无论如何,我设法为所有场景编写了简单的测试用例,但我的beforeEach 有一个巨大的样板。除此之外,现在我想编写更高级的测试用例,其中多次完成请求(n 个客户 > 1)。处理所有固定装置和跟踪单个模拟变得相当复杂。

这是一个常见问题吗?有没有更简单的方法来处理模拟实现?我想过类似mockImplementationNth 之类的东西,但找不到任何东西。

Ps.:更改代码本身很困难,因为它是遗留代码,而且 API 有点笨拙。

【问题讨论】:

    标签: javascript node.js mocking jestjs tdd


    【解决方案1】:

    我曾考虑将场景隔离到一个 setupMocks 函数中,该函数具有默认设置,可以在测试用例中用另一个函数覆盖。它看起来像这样:

    describe('Integration test', () => {
      beforeEach(() => {
        setupMocks()
      })
    
      it('goes well', () => {
        expect(myClass.execute()).resolves.toBe(true)
      })
    
      it('fails to fetch the token', () => {
        overrideMocks('token-failed')
        expect(myClass.execute()).rejects.toEqual('some-error')
      })
    
      (...)
    })
    

    至少测试用例会看起来更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 2017-12-16
      • 2015-04-29
      • 2021-01-01
      • 1970-01-01
      相关资源
      最近更新 更多