Javascript 如何处理大量“MockImplementationOnce”调用

Javascript 如何处理大量“MockImplementationOnce”调用,javascript,node.js,mocking,jestjs,tdd,Javascript,Node.js,Mocking,Jestjs,Tdd,我正在为一个有很多请求的类编写集成测试。请求通过HttpClientsingleton完成 因此,为了避免发出真正的请求,我模拟了对HttpClient的所有调用。问题是,我有太多的要求 调用HttpClient.get获取令牌 调用HttpClient.get获取资源 调用HttpClient.get从该资源获取所有客户 调用HttpClient.get以验证另一个API中是否存在单个客户 条件:HttpClient.post被调用以将这一个客户添加到API中(如果它不存在) 调用HttpCl

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

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

  • 调用HttpClient.get获取令牌
  • 调用HttpClient.get获取资源
  • 调用HttpClient.get从该资源获取所有客户
  • 调用HttpClient.get以验证另一个API中是否存在单个客户
  • 条件:
    HttpClient.post
    被调用以将这一个客户添加到API中(如果它不存在)
  • 调用HttpClient.post将资源添加到另一个API
  • 事实上,这要复杂一点,因为其中一些调用是多次完成的(在一个循环中),但您可以了解情况

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

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

    tokenResponse = { body: { token: 'some-token'}, status: 200 }
    HttpClient.get.mockImplementationOnce(() => tokenResponse)
    tokenResource = { body: <some-fixture-with-resources>, status: 200 }
    HttpClient.get.mockImplementationOnce(() => tokenResource
    (...)
    
    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')
      })
    
      (...)
    })
    
    无论如何,我设法为所有场景编写了简单的测试用例,但是我的
    beforeach
    有一个巨大的样板。除此之外,现在我想编写更高级的测试用例,其中一个请求被多次执行(n个客户>1个)。处理所有装置和跟踪单个模拟变得相当复杂

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


    注:更改代码本身很难,因为它是遗留代码,API有点笨重。

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

    tokenResponse = { body: { token: 'some-token'}, status: 200 }
    HttpClient.get.mockImplementationOnce(() => tokenResponse)
    tokenResource = { body: <some-fixture-with-resources>, status: 200 }
    HttpClient.get.mockImplementationOnce(() => tokenResource
    (...)
    
    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')
      })
    
      (...)
    })
    
    至少测试用例看起来更简单