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\nsinon.jssinon.js支持根据参数模拟返回值,有一个方法名为stub.withArgs(arg1[, arg2, ...]);
使用jest-when - 用于玩笑的 when(fn).calledWith(args).thenReturn(value) lib
如果您坚持使用jestjs, 因为mockReturnValueOnce会按顺序返回值(第一次调用、第二次调用等)。您可以使用以下方式:
index.js:
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}\nRun Code Online (Sandbox Code Playgroud)\n\nindex.test.js:
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});\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
15634 次 |
| 最近记录: |