javascript - 如何在 axios 中解决 Promise 和 spy 函数
问题描述
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();
但它并没有深入到内部来解决成功的结果CB
expect(successCBSpy).toHaveBeenCalled();
抛出错误为:successCB
从不调用
我做错了什么,我应该在这里期待什么?
我只能使用 ES6 解决方案。
解决方案
确保您返回Promise
from,getusers
以便您可以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
回调中执行断言并返回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!
});
})
推荐阅读
- java - Ehcache:如何有条件地返回陈旧数据
- encoding - 如何将飞镖的 ByteData 转换为字符串?
- sql - 如何将 varchar 显示为百分比,同时使用同一个变量进行别名和链接多个表?
- vegan - 如何用固定的嵌套因子解释 permanova adonis 输出?
- python-3.x - 如何修复关键错误 - 使用 Fousquare API @ Python 中的“组”?
- javascript - 使用 axios 获取文件(内容和文件名)
- php - 提供 x,y,width 和 height 值,我如何获得从中心缩放的 svg 变换矩阵
- python - 获得组内最大的差异
- angularjs - 将编译参数传递给 ng-click 指令
- java - 如何使用 graphql-java 响应扩展?