用 async/await 写异步单元测试需声明测试函数为 async,直接 await 被测函数并断言;错误处理用 await expect(fn()).rejects.toThrow() 等原生断言;依赖须 mock 为 Promise;避免忘写 async、混用 done()、mock 未清理等陷阱。

用 async/await 写异步函数的单元测试,核心是让测试框架能正确等待 Promise 完成,同时保持断言逻辑清晰、错误可追踪。
测试函数本身返回 Promise
如果被测函数是 async 函数(即返回 Promise),测试函数也必须是 async 的,才能用 await 获取结果:
- 直接
await调用被测函数,再对返回值做断言 - 确保测试框架(如 Jest、Vitest、Jasmine)支持
async测试函数——主流框架都默认支持 - 不要用
.then()链式调用,会破坏 await 的可读性和错误堆栈
正确处理异步错误(reject)
测试函数抛出异常或 Promise reject 时,不能只靠 try/catch,还要配合断言工具验证错误类型和内容:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- Jest 中推荐用
await expect(fn()).rejects.toThrow(...),语义明确且自动等待 reject - 避免手动
try/catch后用expect(error).toMatch(...),容易漏掉未 catch 的异常导致测试失败不明确 - 若需检查错误对象属性(如
error.status),可用await expect(fn()).rejects.toMatchObject({ status: 404 })
模拟异步依赖(如 fetch 或 API 调用)
真实网络请求不能进单元测试,要用 mock 替换,并确保 mock 也返回 Promise:
- Jest 中用
jest.mock('...')+mockResolvedValue/mockRejectedValue模拟成功/失败场景 - 确保 mock 返回的是 Promise(例如
Promise.resolve(data)),否则await会报错或行为异常 - 测试多个异步路径时(如 loading → success → error),可复用同一 mock 并在不同测试块中切换返回值
避免常见陷阱
几个高频出错点,直接影响测试稳定性和可维护性:
- 忘记在测试函数前加
async,导致await不生效,断言跑在 Promise resolve 前 - 测试中混用
done()回调和await,造成重复完成或超时 - Mock 没清除,影响后续测试(Jest 中建议在
beforeEach里jest.clearAllMocks()) - 断言写在
await外层(比如const res = fn(); expect(res).resolves...),虽能运行但丢失 await 的直观性与调试信息










