乐闻世界logo
搜索文章和话题

如何在 Jest 中测试定时器(setTimeout、setInterval)?如何使用假定时器?

2月21日 15:57

Jest 提供了多种处理定时器的方法,用于测试涉及 setTimeout、setInterval 等定时器的代码:

1. 使用假定时器:

javascript
jest.useFakeTimers(); test('timer callback', () => { const callback = jest.fn(); setTimeout(callback, 1000); jest.runAllTimers(); expect(callback).toHaveBeenCalledTimes(1); });

2. 运行所有定时器:

javascript
jest.runAllTimers(); // 运行所有待处理的定时器

3. 运行到特定时间:

javascript
jest.advanceTimersByTime(1000); // 前进 1000ms jest.runOnlyPendingTimers(); // 只运行当前待处理的定时器

4. 测试 setInterval:

javascript
test('interval timer', () => { const callback = jest.fn(); setInterval(callback, 1000); jest.advanceTimersByTime(3000); expect(callback).toHaveBeenCalledTimes(3); });

5. 清理定时器:

javascript
afterEach(() => { jest.useRealTimers(); // 恢复真实定时器 jest.clearAllTimers(); // 清除所有定时器 });

6. 测试定时器清除:

javascript
test('clear timeout', () => { const callback = jest.fn(); const timeoutId = setTimeout(callback, 1000); clearTimeout(timeoutId); jest.runAllTimers(); expect(callback).not.toHaveBeenCalled(); });

最佳实践:

  • 在测试套件开始时使用 jest.useFakeTimers()
  • 测试完成后恢复真实定时器
  • 使用 advanceTimersByTime 测试时间依赖逻辑
  • 确保清理所有定时器以避免内存泄漏
标签:Jest