【发布时间】:2020-08-04 16:55:08
【问题描述】:
这是我在单元测试时遇到的一个设计问题。 让我们深入示例:
想象一下:
async function foo() {
try {
return apiCall()
}
catch (e) {
throw new CustomError(e);
}
}
async function bar() {
return foo()
}
async function main() {
try {
await bar()
}catch(e) {
console.error(e)
}
}
main()
我们在这里看到了什么?唯一没有 try-catch 块的函数是 bar。 但是如果 foo 失败了,它应该被 main catch 捕获。
像这样进行单元测试时
describe('testing bar', () => {
it('foo should throw', () => {
foo.mockImplementantion(() => { throw new CustomError('error')});
bar()
.then((result) => console.log(result))
.catch((err) => { exepect(err).toBeInstanceOf(CustomError)}) // this is what we are testing
})
})
我们看到的输出是控制台中记录了一个未处理的承诺拒绝。
所以,我的问题是……即使我知道 main() 会捕获错误,我是否应该在所有异步函数中使用 try-catch 块?
【问题讨论】:
-
因为 node.js 进程可以/将因未处理的 Promise 拒绝而终止,建议您始终使用 try/catch 和 await,并始终将 .catch 处理程序添加到 Promise 链的末尾.
-
你告诉我的是我应该将函数
bar()包装在一个 try catch 块中,对吧? -
异步函数
bar返回一个承诺,对吗?异步函数foo可以在它的 catch 块中抛出一个异常,这会导致bar中的 未处理的承诺拒绝,所以........ -
您的测试用例没有
return承诺或使用async/await也没有done回调,因此expect可能会抛出关于在测试结束后被调用。未处理的拒绝的错误信息是什么? -
@Bergi (node:44872) UnhandledPromiseRejectionWarning: CustomError
标签: javascript node.js async-await jestjs