跳至主要内容

使用假计时器

在某些情况下,当您的代码使用计时器 (setTimeoutsetIntervalclearTimeoutclearInterval) 时,您的测试可能会变得不可预测、缓慢且不稳定。

为了解决这些问题,或者如果您需要在代码中依赖特定的时间戳,大多数测试框架都提供了用假计时器替换测试中真实计时器的选项。这有一个副作用——在测试中使用假计时器时,所有测试内部的代码都将使用假计时器。

设置假计时器的常见模式通常是在 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 选项以防止此问题。