测试 async 函数异常需让断言感知 Promise rejection:推荐 await expect(promise).rejects.toThrow();次选 return expect(promise).rejects.toThrow();需校验错误细节时用 try/catch + await;避免直接 .toThrow() 或遗漏 await。

测试 async 函数异常,核心是让断言能感知 Promise 的 rejection 状态,而不是把它当同步错误处理。直接用 .toThrow() 会失败,因为 async 函数返回的是 Promise,出错时是 reject,不是同步 throw。
用 await + expect().rejects.toThrow()(推荐)
这是 Jest/Vitest 中最简洁、语义最清晰的方式。它自动等待 Promise 被 reject,并对错误 reason 做断言:
- ✅ 正确写法:
await expect(fetchUser('invalid-id')).rejects.toThrow('Network error'); - 支持匹配字符串(子串)、正则(如
/timeout/i)、错误构造函数(如TypeError) - 也可校验错误结构:
await expect(apiCall()).rejects.toMatchObject({ code: 'ECONNABORTED' });
不写 async 时用 return expect().rejects
某些老版本 Jest 或需显式返回 Promise 的场景下,可省略 async 关键字,直接返回断言本身:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
test('fails on bad input', () => { return expect(process(null)).rejects.toThrow('required'); });- Jest 会自动等待这个 Promise,效果等同于
await写法
需要检查错误细节时用 try/catch + expect
当要验证堆栈、自定义属性、或非 Jest 环境中,手动捕获更灵活:
- 必须在
try中await调用,否则 catch 捕不到 rejection - catch 后做明确断言,例如:
expect(err).toBeInstanceOf(ValidationError); - 建议加兜底断言(如
expect(true).toBe(false)),防止无错误时“静默通过”
避开常见错误
这些写法都不可靠,容易导致测试误通过或报错:
- ❌
expect(asyncFn()).toThrow()—— 断言的是 Promise 实例,永远不报错 - ❌
expect(() => asyncFn()).toThrow()—— 包裹的是返回 Promise 的动作,不是执行并等待失败 - ❌
expect(asyncFn()).rejects.toThrow()但没加await—— 测试提前结束,Promise 还在 pending - ❌ 在
async测试函数里漏掉await就调用 —— rejection 不触发,断言失效

















