javascript异步测试应避免回调地狱,优先用promise链或async/await;需确保被测函数返回promise,测试中禁用嵌套done(),并mock异步依赖以保障稳定性和可读性。

用 Promise 封装被测异步逻辑
测试前先确保业务代码已返回 Promise,而不是依赖回调参数。例如:
- 把
getUser(id, success, fail)改造成getUser(id),内部返回new Promise(...) - 测试时直接链式调用:
getUser(123).then(user => expect(user.name).toBe('Alice')) - 避免在测试里再传回调——Promise 已经帮你“排队”了
测试中正确使用 done() 仅当必须兼容回调接口
若被测函数仍强制使用回调(如某些老库或 wx.request),测试中需显式调用 done(),但绝不嵌套:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- ✅ 正确:
it('should fetch user via callback', (done) => { getUser(1, (user) => { expect(user.id).toBe(1); done(); }, (err) => done.fail(err) }); }) - ❌ 错误:在 success 回调里再调一次异步操作并嵌套另一个
done()—— 这就是测试里的回调地狱 - 建议:优先封装该回调函数为 Promise,再用标准 Promise 测试方式
用 async/await 写测试,语义最清晰
Jest、Vitest 等主流测试框架原生支持 async 测试函数,可让异步流程像同步一样阅读:
it('should get user then order then detail', async () => { const user = await getUser(1); const order = await getOrder(user.id); const detail = await getOrderDetail(order.id); expect(detail.status).toBe('shipped'); });- 错误自动冒泡,一个
try/catch或顶层.catch()就能捕获任意环节失败 - 没有
done,没有嵌套,没有状态管理负担
Mock 异步依赖,避免真实请求干扰测试流
回调地狱常因多个真实 API 调用串联而加剧。测试中应 mock 掉它们:
- 用
jest.mock('./api')拦截模块,让每个函数返回预设的 Promise - 例如:
mockImplementation(() => Promise.resolve({ id: 1, name: 'Test' })) - 这样测试只关注逻辑顺序和数据流转,不卡在真实网络或定时器上
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










