使用假计时器
在某些情况下,当您的代码使用计时器 (setTimeout
、setInterval
、clearTimeout
、clearInterval
) 时,您的测试可能会变得不可预测、缓慢且不稳定。
为了解决这些问题,或者如果您需要在代码中依赖特定的时间戳,大多数测试框架都提供了用假计时器替换测试中真实计时器的选项。这有一个副作用——在测试中使用假计时器时,所有测试内部的代码都将使用假计时器。
设置假计时器的常见模式通常是在 beforeEach
中,例如
// Fake timers using Jest
beforeEach(() => {
jest.useFakeTimers()
})
由于假计时器正在模拟本机计时器函数,因此在测试运行后恢复计时器是必要的,就像普通的模拟一样。这可以防止假计时器泄漏到其他测试用例和清理函数中,在这些函数中应该使用真实计时器。
为此,您通常会在 afterEach
中调用 useRealTimers
。
在切换到真实计时器之前调用 runOnlyPendingTimers
也很重要。这将确保在切换到真实计时器之前刷新所有挂起的计时器。如果您没有推进计时器,而是直接切换到真实计时器,则计划的任务将不会执行,您将获得意外的行为。这对于在您不知情的情况下调度任务的第三方来说尤为重要。
以下是用 jest 执行此操作的示例
// Running all pending timers and switching to real timers using Jest
afterEach(() => {
jest.runOnlyPendingTimers()
jest.useRealTimers()
})
注意
将假计时器与 user-event
组合可能会导致测试超时。请参阅 advanceTimers
选项以防止此问题。