繁体   English   中英

在 catch 块中测试 console.log

[英]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
});

我哪里错了?

两个问题:

  1. 如果拒绝处理程序不throw或返回被拒绝的承诺,则拒绝处理程序将拒绝转换为履行

  2. 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.postcatch方法调用时返回 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM