如何为特定的 axios 调用模拟 jest.spyOn
How to mock jest.spyOn for a specific axios call
如何模拟特定的 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'
-> return Promise.resolve({ data: 1 })
)
到目前为止,还没有jestjs
的方法可以做到这一点。提案如下:Parameterised mock return values
解决方法如下:
- 使用
sinon.js
sinon.js
支持根据参数模拟返回值,有一个方法名为stub.withArgs(arg1[, arg2, ...]);
使用 jest-when - 用于开玩笑的 when(fn).calledWith(args).thenReturn(value) 库
如果你坚持使用jestjs
,因为mockReturnValueOnce
returns值是顺序的(第一次调用,第二次调用,等等)。您可以使用以下方式:
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/Whosebug/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
如何模拟特定的 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'
-> return Promise.resolve({ data: 1 })
)
到目前为止,还没有jestjs
的方法可以做到这一点。提案如下:Parameterised mock return values
解决方法如下:
- 使用
sinon.js
sinon.js
支持根据参数模拟返回值,有一个方法名为stub.withArgs(arg1[, arg2, ...]);
使用 jest-when - 用于开玩笑的 when(fn).calledWith(args).thenReturn(value) 库
如果你坚持使用
jestjs
,因为mockReturnValueOnce
returns值是顺序的(第一次调用,第二次调用,等等)。您可以使用以下方式:
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/Whosebug/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