如何用Jest测试异步方法抛出的异常?测试失败求助
Jest异步函数异常类验证失败的解决方法
你的异步测试失败的核心原因是写法错误——你把异步函数额外包裹在了async () => ...箭头函数里,导致Jest无法正确捕获异步Promise的reject状态。
错误写法分析
原测试代码中:
test("async failure", async () => await expect(async () => await asyncAction(true)).rejects.toThrow(SyntaxE));
这里的async () => await asyncAction(true)是一个同步执行的函数(它本身不会抛出同步异常,仅返回Promise),而expect的.rejects方法需要直接接收Promise实例,而非返回Promise的函数。
修正后的完整代码
去掉多余的包裹箭头函数,直接将asyncAction(true)返回的Promise传给expect:
describe("Trying to get Jest working", ()=> { test("sync success", () => expect( syncAction(false)).toBe(42)); test("sync failure", () => expect(() => syncAction(true)).toThrow(SyntaxE)); test("async success", async () => expect(await asyncAction(false)).toBe(42)); // 修正后的异步失败测试 test("async failure", async () => await expect(asyncAction(true)).rejects.toThrow(SyntaxE)); }); class SyntaxE { message: string; constructor(message: string) { this.message = message; } } async function asyncAction(p: boolean) { if(p) throw new SyntaxE("Oops!") else return 42; } function syncAction(p: boolean) { if(p) throw new SyntaxE("Oops!") else return 42; }
替代写法
如果不想使用await,也可以直接返回Promise让Jest自动处理:
test("async failure", () => expect(asyncAction(true)).rejects.toThrow(SyntaxE));
两种写法都能正确捕获异步函数抛出的SyntaxE异常,验证其类是否匹配。
内容的提问来源于stack exchange,提问作者Антон Игоревич Злыгостев
相关产品推荐
相关产品推荐

