如何解析 promise 并监视 axios 中的函数
How to resolve promise and spy on a function inside axios
function getusers(config){
const {successCB} = config;
return axios.get(url, params)
.then(response => {
successCB(response.data, config);
});
}
************************ UT ******************************
const mock = new MockAdapter(axios);
const successCB = jest.fn();
mock.onGet(url).reply(200, 'success');
const axiosSpy = jest.spyOn(axios, 'get');
const successCBSpy = jest.spyOn(config, 'successCB');
getUsers({successCB});
axiosSpy 成功通过以下代码
expect(axiosSpy).toHaveBeenCalled();
但它并没有深入内部来解决 successCB
expect(successCBSpy).toHaveBeenCalled();
抛出错误为:successCB
从未调用过
我做错了什么,我应该期待什么?
我只能使用 ES6 解决方案。
确保你 return 来自 getusers
的 Promise
这样你就可以 await
它在你的测试中。
这是一个完整的工作示例:
const axios = require('axios');
const MockAdapter = require('axios-mock-adapter');
const url = 'test-url';
const params = {};
function getusers(config) {
const { successCB } = config;
return axios.get(url, params) // <= return the Promise
.then(response => {
successCB(response.data, config);
});
}
test('getusers', async () => { // <= async test function
const mock = new MockAdapter(axios);
const successCB = jest.fn();
mock.onGet(url).reply(200, 'success');
const axiosSpy = jest.spyOn(axios, 'get');
await getusers({ successCB }); // <= await the Promise
expect(axiosSpy).toHaveBeenCalled(); // Success!
expect(successCB.mock.calls[0][0]).toBe('success'); // Success!
})
更新
如果 async/await
语法不是一个选项,那么您可以在 then
回调中进行断言,并且 return 测试结果 Promise
所以 Jest
知道等一下:
test('getusers', () => {
const mock = new MockAdapter(axios);
const successCB = jest.fn();
mock.onGet(url).reply(200, 'success');
const axiosSpy = jest.spyOn(axios, 'get');
return getusers({ successCB }).then(() => {
expect(axiosSpy).toHaveBeenCalled(); // Success!
expect(successCB.mock.calls[0][0]).toBe('success'); // Success!
});
})
function getusers(config){
const {successCB} = config;
return axios.get(url, params)
.then(response => {
successCB(response.data, config);
});
}
************************ UT ******************************
const mock = new MockAdapter(axios);
const successCB = jest.fn();
mock.onGet(url).reply(200, 'success');
const axiosSpy = jest.spyOn(axios, 'get');
const successCBSpy = jest.spyOn(config, 'successCB');
getUsers({successCB});
axiosSpy 成功通过以下代码
expect(axiosSpy).toHaveBeenCalled();
但它并没有深入内部来解决 successCB
expect(successCBSpy).toHaveBeenCalled();
抛出错误为:successCB
从未调用过
我做错了什么,我应该期待什么?
我只能使用 ES6 解决方案。
确保你 return 来自 getusers
的 Promise
这样你就可以 await
它在你的测试中。
这是一个完整的工作示例:
const axios = require('axios');
const MockAdapter = require('axios-mock-adapter');
const url = 'test-url';
const params = {};
function getusers(config) {
const { successCB } = config;
return axios.get(url, params) // <= return the Promise
.then(response => {
successCB(response.data, config);
});
}
test('getusers', async () => { // <= async test function
const mock = new MockAdapter(axios);
const successCB = jest.fn();
mock.onGet(url).reply(200, 'success');
const axiosSpy = jest.spyOn(axios, 'get');
await getusers({ successCB }); // <= await the Promise
expect(axiosSpy).toHaveBeenCalled(); // Success!
expect(successCB.mock.calls[0][0]).toBe('success'); // Success!
})
更新
如果 async/await
语法不是一个选项,那么您可以在 then
回调中进行断言,并且 return 测试结果 Promise
所以 Jest
知道等一下:
test('getusers', () => {
const mock = new MockAdapter(axios);
const successCB = jest.fn();
mock.onGet(url).reply(200, 'success');
const axiosSpy = jest.spyOn(axios, 'get');
return getusers({ successCB }).then(() => {
expect(axiosSpy).toHaveBeenCalled(); // Success!
expect(successCB.mock.calls[0][0]).toBe('success'); // Success!
});
})