异步测试核心是验证状态正确性、时序可靠性与错误可控性;需聚焦三大目标、匹配工具能力、覆盖典型模式,并警惕微任务陷阱、未await promise及全局状态污染等致命细节。

画 JS 异步代码测试的思维导图,关键不是罗列所有 API,而是聚焦“测什么”和“怎么测准”。核心围绕三类问题展开:状态是否正确、时序是否可靠、错误是否可控。
一、明确异步测试的三大验证目标
异步逻辑容易因时机、状态、上下文出错,测试导图第一层应直指验证维度:
- 状态验证:Promise 是否 resolve/reject?返回值/副作用(如 DOM 变更、变量赋值)是否符合预期?
- 时序验证:回调是否在正确时机触发?多个异步操作的执行顺序、并发行为(如 race/all)是否符合设计?
- 边界与错误验证:网络失败、超时、取消、重复调用等异常路径是否被覆盖?错误是否被正确抛出或捕获?
二、匹配主流测试工具的关键能力点
不同工具对异步的支持方式不同,导图中需标注对应写法:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
Jest:支持
async/await测试函数、jest.useFakeTimers()控制定时器、mockResolvedValue/mockRejectedValue模拟 Promise 行为 -
Vitest:原生支持顶层
await、vi.mock+vi.importActual精确控制模块依赖、vi.runAllTimers()快进时间 -
测试真实异步链:避免只 mock 最终结果,要测完整流程(如 fetch → 处理 → 更新状态),用
waitFor或findBy*(React Testing Library)验证 DOM 实际更新
三、必覆盖的典型异步模式测试要点
按实际编码高频场景组织分支,每个节点带具体断言示例:
-
单个 Promise:
expect(fn()).resolves.toBe(42)或await expect(fn()).resolves.toEqual(...) -
错误处理:
await expect(fn()).rejects.toThrow('Network error');注意catch内部逻辑也要单独测 -
并发控制:测
Promise.all全成功 / 一个失败;Promise.race谁先响应;Promise.allSettled各自结果独立 -
定时器与节流:用 fake timers 检查
setTimeout是否被调用、延迟是否准确、是否被清除(jest.clearAllTimers())
四、易忽略但致命的细节节点
这些点常导致测试“看似通过实则无效”,应在导图中标红强调:
-
微任务 vs 宏任务陷阱:
Promise.then是微任务,setTimeout是宏任务——测试中需用await Promise.resolve()或flush-microtasks确保微任务清空 -
未 await 的 Promise:测试函数内漏写
await,会导致断言在异步完成前就执行,结果不可靠 -
全局状态污染:多个测试共用同一个 mock 函数或计时器,需在
beforeEach/afterEach中重置(jest.resetAllMocks()、jest.restoreAllMocks())










