Jest中两种异步测试写法是否存在功能差异?
Jest异步测试代码的功能差异解析
这两段代码在功能上存在明显差异,核心体现在错误处理逻辑和测试失败反馈上:
1. 错误处理行为不同
- 第一段代码:
await expect(myAsyncFunc()).resolves.toBe("My async func output")
当myAsyncFunc返回的Promise被拒绝时,Jest会通过resolves匹配器捕获这个拒绝,并将其标记为测试失败,不会导致测试因"未处理的Promise拒绝"而崩溃。 - 第二段代码:
expect(await myAsyncFunc()).toBe("My async func output")
如果myAsyncFunc返回的Promise被拒绝,await会直接抛出这个错误,若没有额外的try/catch或错误捕获逻辑,整个测试会直接崩溃,而非优雅地标记为测试失败。
2. 测试失败的提示信息不同
- 使用
resolves匹配器的代码,Jest会生成更贴合异步场景的错误提示,明确告知是Promise的解析值不符合预期,或是Promise被意外拒绝; - 直接
await后断言的代码,错误提示和同步测试类似,仅显示最终获取的值与预期不符,不会强调异步Promise的状态问题。
3. 使用场景的区别
- 若你需要同时验证Promise成功解析的状态和解析值,优先用第一种写法;
- 若你已经确定
myAsyncFunc一定会成功解析,只是要对返回值做断言,第二种写法更简洁,但要注意:如果函数存在拒绝的可能,必须额外添加错误处理逻辑(比如用await expect(myAsyncFunc()).rejects.toThrow()来测试拒绝场景)。
内容的提问来源于stack exchange,提问作者JRagone
相关产品推荐
相关产品推荐

