[英]jest mocking promise method called wrong number of times
作为我的redux动作的一部分,它发出了几个顺序的api请求。 apiCall
方法返回带有一些值的Promise,随后的apiCall
使用该值发出另一个请求,依此类推。 我正在使用Jest测试这些api调用。
const myAPI = { apiCall(param: any): Promise<any> { return new Promise((resolve, reject) => { resolve('result'); }); }, }; const serialAPIRequests = () => { myAPI.apiCall('first_param') .then((result) => { console.log(result); return myAPI.apiCall(result); }) .then((result) => { console.log(result); return myAPI.apiCall(result); }) .then((result) => { console.log(result); return Promise.resolve(result); }); };
我试图编写一个测试以确保apiCall
已被调用正确的次数并具有正确的参数。
describe.only('my test', () => { it('should test api stuff', () => { myAPI.apiCall = jest.fn() .mockReturnValueOnce(Promise.resolve('result1')) .mockReturnValueOnce(Promise.resolve('result2')) .mockReturnValueOnce(Promise.resolve('result3')); serialAPIRequests(); expect(myAPI.apiCall).toHaveBeenCalledTimes(3); }); });
发生的事情是,Jest report Expected mock function to have been called three times, but it was called one time.
开玩笑的测试结果表明
● Console
console.log
result1
console.log
result2
console.log
result3
● my test › should test api stuff
expect(jest.fn()).toHaveBeenCalledTimes(3)
Expected mock function to have been called three times, but it was called one time.
console.log显示不同值的事实意味着模拟返回已通过模拟函数正确传递,并且被调用了3次。
是什么原因造成的?如何正确测试此功能?
承诺是异步的,因此当您检查该模拟实际上被调用过一次时,就可以了。
您可以这样做。 等待所有调用完成并返回承诺以表明测试是异步的。
return serialAPIRequests().then(() => {
expect(myAPI.apiCall).toHaveBeenCalledTimes(3);
})
使用async / await测试异步代码。 在此处阅读更多信息: https : //facebook.github.io/jest/docs/en/tutorial-async.html
describe.only('my test', () => {
it('should test api stuff', async () => {
myAPI.apiCall = jest.fn()
.mockReturnValueOnce(Promise.resolve('result1'))
.mockReturnValueOnce(Promise.resolve('result2'))
.mockReturnValueOnce(Promise.resolve('result3'));
await serialAPIRequests();
expect(myAPI.apiCall).toHaveBeenCalledTimes(3);
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.