Jest 提供了多种处理定时器的方法,用于测试涉及 setTimeout、setInterval 等定时器的代码:
1. 使用假定时器:
javascriptjest.useFakeTimers(); test('timer callback', () => { const callback = jest.fn(); setTimeout(callback, 1000); jest.runAllTimers(); expect(callback).toHaveBeenCalledTimes(1); });
2. 运行所有定时器:
javascriptjest.runAllTimers(); // 运行所有待处理的定时器
3. 运行到特定时间:
javascriptjest.advanceTimersByTime(1000); // 前进 1000ms jest.runOnlyPendingTimers(); // 只运行当前待处理的定时器
4. 测试 setInterval:
javascripttest('interval timer', () => { const callback = jest.fn(); setInterval(callback, 1000); jest.advanceTimersByTime(3000); expect(callback).toHaveBeenCalledTimes(3); });
5. 清理定时器:
javascriptafterEach(() => { jest.useRealTimers(); // 恢复真实定时器 jest.clearAllTimers(); // 清除所有定时器 });
6. 测试定时器清除:
javascripttest('clear timeout', () => { const callback = jest.fn(); const timeoutId = setTimeout(callback, 1000); clearTimeout(timeoutId); jest.runAllTimers(); expect(callback).not.toHaveBeenCalled(); });
最佳实践:
- 在测试套件开始时使用
jest.useFakeTimers() - 测试完成后恢复真实定时器
- 使用
advanceTimersByTime测试时间依赖逻辑 - 确保清理所有定时器以避免内存泄漏