异步测试规范要求可预测、可复现、可维护:统一用Jest,禁用真实定时器,显式await/return,全覆盖错误路径,强制状态隔离与副作用清除。

团队异步代码测试的规范,核心在于可预测、可复现、可维护。不是写一堆 it 用例就叫测试,而是让每个异步行为在测试中能被明确控制、清晰断言、稳定通过。
统一测试框架与运行环境
避免多套工具混用导致认知成本上升和 CI 不一致:
- 首选 Jest:开箱支持 Promise、async/await、定时器模拟(
jest.useFakeTimers())、自动清理(afterEach(() => jest.clearAllMocks())) - 禁用
setTimeout/setInterval的真实调度,全部走 fake timers;对fetch或axios统一使用jest.mock('node-fetch')或msw拦截请求 - 所有测试文件必须以
.test.js或.spec.js结尾,且置于__tests__目录或与源码同级
异步逻辑必须显式等待与超时防护
禁止依赖“执行顺序巧合”或隐式 resolve:
- 每个返回 Promise 的函数调用,必须用
await或return显式接入测试链,例如:await expect(fetchUser(1)).resolves.toEqual(...) - 所有
it测试块内,若含异步操作,函数签名必须为async () => { ... },且不手动调用done() - 为每个测试设置合理超时(
jest.setTimeout(5000)),防止挂起阻塞 CI;关键异步路径(如重试逻辑)需覆盖超时分支
错误路径必须全覆盖,拒绝静默失败
异步错误最容易被吞掉,测试要主动“逼出”异常:
立即学习“Java免费学习笔记(深入)”;
- 对可能 reject 的 Promise,必须用
.rejects断言,例如:await expect(api.delete('/user/999')).rejects.toThrow('404') - 禁止只测成功路径;每个 API 调用至少覆盖:正常响应、网络失败、服务端错误(4xx/5xx)、解析失败(JSON parse error)
- catch 块中的副作用(如日志、上报)需 mock 并验证是否执行,确保错误处理逻辑真实生效
状态隔离与副作用清除成强制项
避免测试间相互污染,尤其涉及全局状态、缓存、定时器:
- 每个
beforeEach清空 mock(jest.clearAllMocks())、重置模块状态(jest.resetModules())、还原 fake timers(jest.useRealTimers()后再切回) - 对依赖 localStorage/sessionStorage 的逻辑,测试前 mock 全局对象并重置键值
- 使用
jest.isolateModules(() => { ... })隔离模块加载,防止单例缓存影响后续测试


















