【问题标题】:How to mock jest.spyOn for a specific axios call如何为特定的 axios 调用模拟 jest.spyOn
【发布时间】:2020-05-02 06:00:25
【问题描述】:

如何模拟特定的 axios 调用? 想象一下 2 次 GET 调用:

await axios.get('api/numbers');
await axios.get('api/letters');

那么测试中是这样进行的:

const mockGet = jest.spyOn(axios, 'get');
mockGet.mockReturnValueOnce(Promise.resolve({ data: 1 }));
mockGet.mockReturnValueOnce(Promise.resolve({ data: 'a' }));

如何根据传递给 axios 的 url 为mockReturnValueOnce 创建条件(比如'api/numbers' -> 返回Promise.resolve({ data: 1 })

【问题讨论】:

    标签: javascript jestjs axios spyon


    【解决方案1】:

    到目前为止,还没有jestjs 的方法可以做到这一点。建议如下:Parameterised mock return values

    以下是解决方案:

    1. 使用sinon.js

    sinon.js支持根据参数mock返回值,有一个方法叫stub.withArgs(arg1[, arg2, ...]);

    1. 使用jest-when - 开玩笑的 when(fn).callWith(args).thenReturn(value) 库

    2. 如果您坚持使用jestjs,因为mockReturnValueOnce 按顺序返回值(第一次调用,第二次调用等)。您可以使用以下方式:

    index.js:

    import axios from 'axios';
    
    export async function main() {
      const numbersRes = await axios.get('api/numbers');
      const lettersRes = await axios.get('api/letters');
      return { numbersRes, lettersRes };
    }
    

    index.test.js:

    import { main } from '.';
    import axios from 'axios';
    
    describe('59751925', () => {
      it('should pass', async () => {
        const mockGet = jest.spyOn(axios, 'get');
        mockGet.mockImplementation((url) => {
          switch (url) {
            case 'api/numbers':
              return Promise.resolve({ data: 1 });
            case 'api/letters':
              return Promise.resolve({ data: 'a' });
          }
        });
        const actual = await main();
        expect(actual.numbersRes).toEqual({ data: 1 });
        expect(actual.lettersRes).toEqual({ data: 'a' });
      });
    });
    

    单元测试结果:

     PASS  src/stackoverflow/59751925/index.test.js (11.168s)
      59751925
        ✓ should pass (9ms)
    
    Test Suites: 1 passed, 1 total
    Tests:       1 passed, 1 total
    Snapshots:   0 total
    Time:        13.098s
    

    【讨论】:

    • 我确认第 3 点。回答原始问题!感谢您的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 2022-07-17
    • 2021-07-11
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多