运行Jest测试报setTimeout(...).unref is not a function错误如何解决
报错原因与解决方案
根因说明
Jest 26默认启用了模拟定时器(fake timers),会重写全局的setTimeout、setInterval等方法,返回的模拟定时器对象没有原生Node.js定时器自带的unref方法。而node-rdkafka库内部的错误处理逻辑会调用setTimeout(...).unref(),调用不存在的方法就触发了该类型错误。
解决方案
- 方案1:启用真实定时器(最推荐)
如果你不需要在测试中控制定时器时间,直接使用Node原生定时器即可解决问题。
单测试文件生效:在测试文件顶部或者beforeAll钩子中添加代码:
全局生效:修改jest.useRealTimers()jest.config.js配置文件,添加如下配置:module.exports = { // 其他原有配置 timers: "real" } - 方案2:手动补充unref方法(适用于必须使用模拟定时器的场景)
如果你的测试逻辑依赖Jest的模拟定时器能力,可以在Jest全局初始化脚本中给模拟的定时器补上空实现的unref方法:
首先在jest.config.js中指定初始化脚本:
然后在项目根目录新建module.exports = { // 其他原有配置 setupFilesAfterEnv: ['./jest.setup.js'] }jest.setup.js,添加如下代码:const originalSetTimeout = global.setTimeout global.setTimeout = (...args) => { const timer = originalSetTimeout(...args) if (!timer.unref) timer.unref = () => {} return timer } - 方案3:Mock
node-rdkafka库(适用于单元测试无需真实连接Kafka的场景)
单元测试场景下如果不需要真实调用Kafka能力,可以直接Mock整个node-rdkafka库,避开对其内部源码的调用:
在项目根目录新建__mocks__/node-rdkafka.js,编写符合你业务调用逻辑的Mock实现即可。
内容的提问来源于stack exchange,提问作者Anshul Sharma
相关产品推荐
相关产品推荐

