目标
防抖测试依赖真实定时器与 CI 负载下的竞态,导致时不时的抖动。本配方在测试前安装伪定时器并显式推进时钟,断言防抖在窗口结束前不触发、结束后仅触发一次,再在每个用例后恢复定时器;提醒处理 Promise 时需刷新微任务。
步骤要点
- 测试前安装伪定时器并显式推进时钟。
- 断言防抖窗口边界行为。
- 在 afterEach 中恢复定时器避免泄漏。
- 推进时钟时刷新微任务以解析 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 时序。
- 需要正确处理微任务顺序。