Jest无法监控setInterval内fetchTokens调用的问题求助
问题分析与解决方法
核心问题
你的测试代码存在两个关键问题,导致无法捕获setInterval内的fetchTokens调用:
- Spy创建时机错误:先调用
jest.advanceTimersByTime(60000)再创建spy,会导致spy无法监控到后续执行的定时器回调。 - 未启用Jest假定时器:未开启fake timers时,
jest.advanceTimersByTime无法模拟时间快进,定时器回调不会被触发。
注:业务代码中fetchTokens的定义语法有误(const fetchTokens() => {}无效),默认这是笔误,假设其为service实例的正常方法。
修正后的测试代码
// 启用Jest假定时器 jest.useFakeTimers(); // 先创建spy,再执行业务逻辑 const fetchTokensSpy = jest.spyOn(service, 'fetchTokens'); await service.main(); // 快进60秒,触发所有定时器回调 jest.advanceTimersByTime(60000); // 断言调用次数:初始1次 + 60秒内60次 = 61次 expect(fetchTokensSpy).toHaveBeenCalledTimes(61); // 恢复真实定时器,避免影响其他测试 jest.useRealTimers();
关键注意事项
- Spy创建顺序:必须在执行
service.main()前创建spy,确保覆盖所有后续调用(包括初始await和定时器内的调用)。 - 假定时器启用:通过
jest.useFakeTimers()让Jest模拟定时器,advanceTimersByTime才能触发setInterval的回调。 - 调用次数计算:60秒内每隔1秒调用一次,加上初始的1次,总共61次,断言时需对应这个数值。
- 资源清理:测试结束后用
jest.useRealTimers()恢复真实定时器,避免干扰其他测试用例。
额外排查点
若问题仍存在,检查业务代码中fetchTokens的绑定:
- 确保
fetchTokens是service实例的方法,而非局部函数(否则this.fetchTokens指向错误,spy无法捕获)。 - 若用箭头函数定义
fetchTokens,需确认this指向正确的service实例。
内容的提问来源于stack exchange,提问作者Scoobie
相关产品推荐
相关产品推荐

