簡體   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