javascript单元测试中使用async/await需声明测试函数为async,让框架自动等待promise完成;正确await异步调用后再断言,避免漏等;用jest.mock或vi.mock隔离外部依赖,并配合fake timers处理定时器。

在 JavaScript 单元测试中使用 async/await 很简单,关键是要让测试框架知道当前测试是异步的,并正确等待 Promise 完成。
确保测试函数返回 Promise 或标记为 async
主流测试框架(如 Jest、Vitest、Jasmine)都支持 async 测试函数。只需把测试回调声明为 async,内部用 await 调用异步操作即可,框架会自动等待返回的 Promise。
- Jest/Vitest 中直接写
test('...', async () => { ... }) - 不要手动调用
done()—— 这是旧式回调风格,和async/await冲突 - 如果函数本身返回 Promise,也可直接
return myAsyncFn(),但async/await更易读、更利于错误定位
正确断言异步结果
避免在 await 之前或之后漏掉关键断言。常见错误是忘记 await 异步调用,导致断言执行时数据还没就绪。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- ✅ 正确:
const result = await fetchData(); expect(result).toEqual(...); - ❌ 错误:
const result = fetchData(); expect(result).resolves.toEqual(...);(虽能跑通,但丢失堆栈、难调试) - 对抛出异常的异步操作,用
await expect(...).rejects.toThrow(...)或包裹try/catch后断言
模拟异步依赖(如 API 调用)
单元测试应隔离外部影响。用 jest.mock(Jest)或 vi.mock(Vitest)模拟异步函数,返回已知的 Promise。
- 例如 mock
fetch:在测试前global.fetch = jest.fn(() => Promise.resolve({...})) - 可控制 resolve 值、reject 行为、甚至延迟:
Promse.resolve().then(() => data) - 确保 mock 在每个测试后清理(
afterEach(() => { jest.clearAllMocks() }))
处理定时器或副作用(如 setTimeout)
若被测代码含定时器,需启用测试环境的 fake timers,否则测试会真实等待,拖慢执行速度。
- Jest 中:测试开始前加
jest.useFakeTimers(),结束后jest.runAllTimers()或jest.advanceTimersByTime(ms) - Vitest 中:用
vi.useFakeTimers()+vi.runAllTimers() - 记得恢复真实计时器(
jest.useRealTimers())或使用beforeEach/afterEach自动管理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










