测试 promise 必须等待其完成后再断言:成功态用 await expect(p).resolves,拒绝态用 await expect(p).rejects;禁止同步断言 promise 实例或用 tothrow() 检测 async 函数。

测试 Promise 的关键在于让断言工具明确知道你在等待一个异步结果,而不是直接检查返回值或用同步方式捕获错误。
同步断言不适用于 Promise 返回值
Promise 对象本身不是最终值,而是状态容器。直接对它做 toEqual、toBe 等断言,只会比对 Promise 实例,毫无意义。
- ❌ 错误示例:
expect(fetchUser(123)).toBe({ id: 123 })—— 这是在断言 Promise 对象,不是它的结果 - ✅ 正确做法:必须 等待 Promise 完成,再断言其 resolve 值或 reject 原因
成功态用 await + expect().resolves
Jest 和 Vitest 都支持 .resolves 断言链,它会自动等待 Promise 兑现,并把后续断言作用于兑现值上。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 写法简洁:
await expect(fetchUser(123)).resolves.toEqual({ id: 123, name: 'Alice' }) - 支持链式校验:
.resolves.toHaveProperty('name')、.resolves.toBeInstanceOf(Object) - 如果 Promise 意外 resolve 成其他值(比如 null),测试会自然失败,无需额外判断
拒绝态统一用 expect().rejects
无论被测函数是显式 Promise.reject() 还是 async 函数中 throw,都应使用 .rejects 断言。
- ✅ 推荐写法:
await expect(fetchUser(999)).rejects.toThrow('User not found') - ✅ 也可匹配错误对象:
.rejects.toEqual(new Error('timeout')) - ❌ 避免
expect(() => fetchUser(999)).toThrow()—— async 函数同步返回 Promise,永远不会同步抛错 - ❌ 避免手动 try/catch + expect(error) —— 容易遗漏未捕获 rejection,触发 Jest 警告
注意微任务执行时机的干扰
若测试逻辑中混入 Promise.then、queueMicrotask 或其他微任务,可能影响断言顺序。确保:
- 所有异步操作都通过
await或.resolves/.rejects显式等待 - 避免在测试体中穿插未 await 的 Promise 链,否则断言可能在微任务执行前就运行
- 必要时用数组收集执行痕迹(如
log.push('then-1'))来验证微任务清空顺序










