跳到主要内容

使用模拟的计时器

在某些情况下,当你的代码使用了计时器 (setTimeout, setInterval, clearTimeout, clearInterval),你的测试可能会变得不可预测,缓慢或不稳定。

为了解决这些问题,或者如果你需要在你的代码中依赖特定的时间戳,大多数测试框架提供 的选项是用假的计时器替换你测试中的真实计时器。这应该是零星使用,而不是经常使用, 因为使用它包含一些开销。

当在你的测试中使用假的计时器时,你的测试里面的所有代码都使用假的计时器。

设置假定时器的常见模式通常是在beforeEach内,例如:

// 使用 Jest 模拟计时器
beforeEach(() => {
jest.useFakeTimers()
})

一旦使用了模拟计时器,你需要记住在测试运行后恢复计时器。

这样做的主要原因是为了防止在你的测试完成后运行的第三方库(如清理函数)与你的假计 时器耦合,而使用真正的计时器。

为此,你通常在 afterEach 中调用 useRealTimers

在切换到真正的定时器之前,调用runOnlyPendingTimers是很重要的。这将确保你在切换 到真正的定时器之前冲刷所有的待定定时器。如果你不对定时器进行处理,而只是切换到真 实的定时器,计划的任务将不会被执行,你会得到一个意外的行为。这对那些在你不知道的 情况下安排任务的第三方来说非常重要。

下面是一个用 Jest 实现的例子:

// Running all pending timers and switching to real timers using Jest
afterEach(() => {
jest.runOnlyPendingTimers()
jest.useRealTimers()
})