![](/img/trans.png)
[英]In catch(e) block, console.log(e.message) does not work with some error messages
[英]Testing console.log in catch block
我有以下代码:
loggerManager.js:
export default log(message) {
try {
axios.post(...).catch(error) { console.log(error); }
}catch(error) {
console.log(error);
}
}
loggerManager.test.js:
test('', () => {
jest.spyOn(global.console, 'log');
jest.mock('axios');
axios.post = jest.fn(() => Promise.reject('fail'));
log('message');
expect(console.log).toBeCalledWith('fail'); // The result said it has not been called even once
});
我哪里错了?
两个问题:
如果拒绝处理程序不throw
或返回被拒绝的承诺,则拒绝处理程序将拒绝转换为履行
try
/ catch
不会捕获承诺拒绝,除非在try
块中通过await
消耗承诺
因此,假设正常情况下,如果axios.post
的承诺被拒绝,则拒绝处理程序会运行,但catch
块不会。
在这段代码中:
export default log(message) {
try {
axios.post(...).catch(error) { console.log(error); }
}catch(error) {
console.log(error);
}
}
执行将只在最后进入catch
块,如果:
axios
是一个未声明的标识符; 或者axios
没有post
属性; 或者axios.post
不是一个函数; 或者axios.post
在调用时抛出; 或者axios.post
不返回带有catch
属性的对象; 或者axios.post
返回的对象的catch
属性不是一个函数; 或者axios.post
的catch
方法调用时返回 throws 如果axios.post
返回被拒绝的承诺,则不会输入。
你可能想要这个:
export default async log(message) {
// −−−−−−−−−−−−^^^^^
try {
await axios.post(...);
// −^^^^^
}catch(error) {
console.log(error);
}
}
这样,如果调用axios.post
出现问题或者axios.post
返回一个被拒绝的承诺,就会进入catch
块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.