如何针对特定的 axios 调用模拟 jest.spyOn

Tud*_*rar 8 javascript jestjs spyon axios

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

await axios.get('api/numbers');
await axios.get('api/letters');
Run Code Online (Sandbox Code Playgroud)

那么测试中是这样的:

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

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

sli*_*wp2 13

到目前为止,还没有方法jestjs可以做到这一点。这是建议:参数化模拟返回值

\n\n

以下是解决方案:

\n\n
    \n
  1. 使用sinon.js
  2. \n
\n\n

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

\n\n
    \n
  1. 使用jest-when - 用于玩笑的 when(fn).calledWith(args).thenReturn(value) lib

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

  4. \n
\n\n

index.js:

\n\n
import axios from \'axios\';\n\nexport async function main() {\n  const numbersRes = await axios.get(\'api/numbers\');\n  const lettersRes = await axios.get(\'api/letters\');\n  return { numbersRes, lettersRes };\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

index.test.js:

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

单元测试结果:

\n\n
 PASS  src/stackoverflow/59751925/index.test.js (11.168s)\n  59751925\n    \xe2\x9c\x93 should pass (9ms)\n\nTest Suites: 1 passed, 1 total\nTests:       1 passed, 1 total\nSnapshots:   0 total\nTime:        13.098s\n
Run Code Online (Sandbox Code Playgroud)\n