You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jest无法监控setInterval内fetchTokens调用的问题求助

问题分析与解决方法

核心问题

你的测试代码存在两个关键问题,导致无法捕获setInterval内的fetchTokens调用:

  1. Spy创建时机错误:先调用jest.advanceTimersByTime(60000)再创建spy,会导致spy无法监控到后续执行的定时器回调。
  2. 未启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:22:17