[英]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.