我想测试一个类内的异步函数,该类使用axios进行Web服务器调用,并且出现错误提示
Received promise rejected instead of resolved
Rejected to value: [TypeError: errorHandler is not a function]
我进行通话的实际代码如下:
import axios from 'axios';
export default class MyClass{
constructor(config){
this.config = config;
}
async getUsers(url, params, successHandler, errorHandler) {
return axios.post(url, params)
.then(resp => this.handleAPIResponse.call(this, resp, successHandler, errorHandler))
.catch(error => errorHandler);
}
}
我的测试文件如下
import MyClass from './mycode.js';
import axios from 'axios';
jest.mock('axios');
beforeEach(() => {
instance = new MyClass({ env: 'prod' });
});
afterEach(() => {
jest.clearAllMocks();
});
const mockResponseData = jest.fn((success, payload) => {
return {
data: {
result: {
success,
payload
}
}
};
});
test('should return all the users', async () => {
const successHandler = jest.fn();
const errorHandler = jest.fn();
axios.post.mockImplementationOnce(() => {
return Promise.resolve({
data:['John Doe', 'Charles']
});
});
const response = await myClass.getUsers('url', {}, successHandler, errorHandler);
console.log(response); // This logs undefined
expect(successHandler).toHaveBeenCalledTimes(1);
});
此外,我只想清除一下,在我的__mocks__
目录下有一个src
文件夹,在其中有一个名为axios.js
的文件,在其中进行了模拟每个axios
方法。看起来像这样:
export default {
post: jest.fn(() => Promise.resolve({ data: {} }))
};
谢谢。
答案 0 :(得分:1)
Jest documentation明确表示:
当我们在测试中需要该模块时,需要。显式调用
jest.mock('./moduleName')
。
所以您需要致电
jest.mock('axios')
为了使用您的__mocks__/axios.js
答案 1 :(得分:0)
我认为问题在于您的类使用的是实际包,而您的spec文件使用的是模拟包。
您必须直接在您的规范文件或setupTests.js
文件中对其进行模拟:
import axios from 'axios'
jest.spyOn(axios, 'post')
.mockImplementationOnce(...)
编辑:也许尝试在您的步骤文件顶部调用jest.mock('axios');
。有点重复,但有时Jest只是需要此命令才能正确模拟。