Reactjs 未处理的PromisejectionWarning:
我正在尝试测试ReactJs组件,其中一个组件有一个方法可以获取数据,这个方法有一个承诺。。所以我尝试创建一个模拟文件:Reactjs 未处理的PromisejectionWarning:,reactjs,jestjs,Reactjs,Jestjs,我正在尝试测试ReactJs组件,其中一个组件有一个方法可以获取数据,这个方法有一个承诺。。所以我尝试创建一个模拟文件: const apiFetch = { value() { return 42 }, } module.exports = apiFetch 然后: const spy = jest.spyOn(apiFetch, 'value') const isValue = apiFetch.value() expect(spy
const apiFetch = {
value() {
return 42
},
}
module.exports = apiFetch
然后:
const spy = jest.spyOn(apiFetch, 'value')
const isValue = apiFetch.value()
expect(spy).toHaveBeenCalled()
expect(isValue).toBe(42)
测试正在通过,但此警告仍在显示
我补充了一件事:
process.on('UnhandledPromiseRejectionWarning', (e) => { throw e })
未处理的PromisejectionWarning:未处理的承诺拒绝。这
错误源于异步函数的内部抛出
没有拦截,或拒绝未处理的承诺
with.catch()。(拒绝id:188)
当运行异步测试时,您应该记住,您需要在测试完成时指示测试方法 通过开玩笑,你可以做如下事情: apiFetch.js
const apiFetch = {
value() {
return Promise.resolve(42);
},
}
module.exports = apiFetch
apiFetch.test.js:
const apiFetch = require('./apiFetch');
test('the data is peanut butter', done => {
apiFetch.value().then(data => {
expect(data).toBe(42);
done();
})
});
done是一个注入的函数参数(由jest框架提供),调用该参数时,表示测试方法的结束
如果您在测试异步逻辑时没有使用jest(或mocha)的异步特性,那么即使异步承诺失败,测试也会通过
编辑
每个框架都有承诺支持。开玩笑的话有点像
it('works with resolves', () => {
expect.assertions(1);
return expect(apiFetch.value()).resolves.toEqual(42);
});
使用纯回调时,请使用注入的done
当使用承诺时,您可以使用注入的“done”函数,但是如果承诺失败并且没有调用“done”,那么测试将在超时时失败。对于jest,在测试承诺逻辑时,建议使用“it”、“expect”和“resolve”。在运行异步测试时,应记住,在测试完成时需要指示测试方法 通过开玩笑,你可以做如下事情: apiFetch.js
const apiFetch = {
value() {
return Promise.resolve(42);
},
}
module.exports = apiFetch
apiFetch.test.js:
const apiFetch = require('./apiFetch');
test('the data is peanut butter', done => {
apiFetch.value().then(data => {
expect(data).toBe(42);
done();
})
});
done是一个注入的函数参数(由jest框架提供),调用该参数时,表示测试方法的结束
如果您在测试异步逻辑时没有使用jest(或mocha)的异步特性,那么即使异步承诺失败,测试也会通过
编辑
每个框架都有承诺支持。开玩笑的话有点像
it('works with resolves', () => {
expect.assertions(1);
return expect(apiFetch.value()).resolves.toEqual(42);
});
使用纯回调时,请使用注入的done
当使用承诺时,您可以使用注入的“done”函数,但是如果承诺失败并且没有调用“done”,那么测试将在超时时失败。对于jest,建议在测试承诺逻辑时使用“it”、“expect”和“resolve”。问题不包含。被拒绝的承诺在哪里?问题不包括。被拒绝的承诺在哪里?所有现代测试框架都支持承诺。如果测试失败,您提供的代码将导致测试超时和未处理的拒绝警告。不要在承诺中使用
done
,这是错误的。@estus谢谢你的评论。你说得对。我编辑了answerAll现代测试框架支持承诺。如果测试失败,您提供的代码将导致测试超时和未处理的拒绝警告。不要在承诺中使用done
,这是错误的。@estus谢谢你的评论。你说得对。我已经编辑了答案