← 中文资源

简体中文版本

用 Sinon 伪定时器控制时间

在测试中用伪定时器控制时间,使防抖、重试与超时逻辑确定而非抖动。

阅读英文原文

目标

防抖测试依赖真实定时器与 CI 负载下的竞态,导致时不时的抖动。本配方在测试前安装伪定时器并显式推进时钟,断言防抖在窗口结束前不触发、结束后仅触发一次,再在每个用例后恢复定时器;提醒处理 Promise 时需刷新微任务。

步骤要点

  1. 测试前安装伪定时器并显式推进时钟。
  2. 断言防抖窗口边界行为。
  3. 在 afterEach 中恢复定时器避免泄漏。
  4. 推进时钟时刷新微任务以解析 Promise。
const clock = sinon.useFakeTimers();
let calls = 0;
const debounced = debounce(() => calls++, 300);
debounced(); debounced(); clock.tick(299);
expect(calls).toBe(0);
clock.tick(1);
expect(calls).toBe(1);
clock.restore();

排错提示

  • 伪定时器下 Promise 可能不解析,需刷新微任务。
  • 未恢复定时器会让测试挂起。
  • 过度模拟时间会掩盖真实延迟。

适用边界

  • 不覆盖真实 I/O 时序。
  • 需要正确处理微任务顺序。