当你的代码中设置了很长的定时器(timeout),而你又不想在测试中等待它们时,fake timers 会非常有用。
Rstest 提供了一些实用函数,基于 @sinonjs/fake-timers 实现定时器的模拟。
rs.useFakeTimers
(config?: FakeTimerInstallOpts) => Rstest
调用此方法可以启用定时器的模拟。底层使用 @sinonjs/fake-timers。
你也可以传递配置对象以自定义 fake timers 的行为。
rs.useRealTimers
() => Rstest
恢复原生的定时器函数(如 setTimeout
、setInterval
等),关闭 fake timers。
rs.isFakeTimers
() => boolean
如果当前启用了 fake timers,则返回 true
,否则返回 false
。
rs.setSystemTime
(now?: number | Date) => Rstest
设置 fake timers 使用的当前系统时间。适用于需要测试依赖当前日期或时间的代码。
rs.getRealSystemTime
() => number
即使在启用 fake timers 时,也可以返回真实系统时间(时间戳)。
rs.runAllTicks
() => Rstest
运行所有已排队的微任务(如 process.nextTick
)。
rs.runAllTimers
() => Rstest
执行所有待运行的定时器(包括 timeout 和 interval)。
rs.runAllTimersAsync
() => Promise<Rstest>
异步执行所有待运行的定时器。
rs.runOnlyPendingTimers
() => Rstest
只运行当前待运行的定时器(不会调度新的定时器)。
rs.runOnlyPendingTimersAsync
() => Promise<Rstest>
异步只运行当前待运行的定时器。
rs.advanceTimersByTime
(ms: number) => Rstest
将 fake timers 快进指定的毫秒数,并执行在此期间计划的所有定时器。
rs.advanceTimersByTimeAsync
(ms: number) => Promise<Rstest>
异步快进 fake timers 指定的毫秒数。
rs.advanceTimersToNextTimer
(steps?: number) => Rstest
将定时器推进到下一个计划的定时器,可选地指定推进的步数。
rs.advanceTimersToNextTimerAsync
(steps?: number) => Promise<Rstest>
异步将定时器推进到下一个计划的定时器。
rs.advanceTimersToNextFrame
() => Rstest
将定时器推进到下一个动画帧。
rs.getTimerCount
() => number
返回当前 fake timers 中还剩多少个待运行的定时器。
rs.clearAllTimers
() => Rstest
移除所有已计划但尚未执行的定时器。