首页 > 解决方案 > 在 catch 块中测试 console.log

问题描述

我有以下代码:

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
});

我哪里错了?

标签: javascriptreactjspromisejestjsmocking

解决方案


两个问题:

  1. 拒绝处理程序将拒绝转换为履行,如果它没有throw或返回一个被拒绝的承诺

  2. try/catch不会捕获 Promise 拒绝,除非 Promiseawaittry块内被使用

所以假设正常情况下,如果你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属性的对象;或者
  • catch对象返回的属性axios.post不是函数;或者
  • 对象的catch方法在axios.post调用时返回 throws

如果返回一个被拒绝的承诺,它将不会被输入。axios.post

你可能想要这个:

export default async log(message) {
// −−−−−−−−−−−−^^^^^
  try {
    await axios.post(...);
// −^^^^^
  }catch(error) {
    console.log(error);
  }
}

这样,如果catch调用有问题axios.post axios.post返回被拒绝的承诺,则将进入该块。


推荐阅读