jest 的 fake timers 可精确控制定时器行为,提升测试速度与可靠性;需调用 jest.usefaketimers() 启用、jest.userealtimers() 恢复,并用 runalltimers、advancetimersbytime 等方法显式推进时间。

Jest 的 fake timers 能让你精确控制 setTimeout、setInterval 等定时器的行为,避免真实等待,让测试又快又可靠。
启用 fake timers
在测试文件顶部或 beforeEach 中调用:
-
jest.useFakeTimers()—— 启用 fake timers(推荐用这个) - 或者
jest.useFakeTimers({ legacyFakeTimers: true })兼容旧版行为(如需jest.runAllImmediates())
记得在 afterEach 或 afterAll 中恢复: jest.useRealTimers(),防止影响其他测试。
触发定时器执行
fake timers 不会自动推进时间,你需要显式“推动”它:
-
jest.runAllTimers()—— 立即执行所有已设定但未触发的定时器(包括嵌套的) -
jest.advanceTimersByTime(ms)—— 模拟过去指定毫秒,只触发在此期间到期的定时器 -
jest.advanceTimersToNextTimer()—— 只触发下一个最早到期的定时器(适合逐个验证逻辑)
例如:一个函数调用 setTimeout(cb, 1000),用 jest.advanceTimersByTime(1000) 后,cb 就会被调用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
测试带清除逻辑的定时器
如果代码里用了 clearTimeout 或 clearInterval,fake timers 也能准确模拟清除效果:
- 先保存返回的 timer ID:
const id = setTimeout(...) - 再调用
clearTimeout(id) - 之后即使调用
jest.runAllTimers(),该回调也不会执行
你可以用 expect(setTimeout).toHaveBeenCalledTimes(1) 配合 jest.mock('timers')(不推荐)或更简单地——直接断言副作用是否发生(比如某个状态没更新、DOM 没变化)来验证清除生效。
注意异步与 Promise 链中的定时器
如果定时器在 async 函数或 Promise.then() 里被设置,fake timers 依然生效,但要注意执行顺序:
-
await不会自动等待 fake timer 触发,你得手动推进时间 - 常见写法:
await Promise.resolve(); jest.advanceTimersByTime(1000);(确保 microtask 队列清空后再推进) - 或者用
await act(async () => { ... })(配合 React 测试时)
避免在测试中混用 real 和 fake timers;一旦启用了 fake,所有全局定时器 API 都会被接管。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










