运行Jest测试时出现ReferenceError及编码错误求助
问题解决思路与实操方案
一、搞定‘cesu8’编码未识别错误
- 直接在测试文件最顶部显式导入并注册iconv-lite的编码支持:
import iconv from 'iconv-lite'; iconv.extendNodeEncodings(); - 嫌每个测试文件都加麻烦的话,在Jest配置里全局注册:
新建setup-jest.js文件:
然后在const iconv = require('iconv-lite'); iconv.extendNodeEncodings();jest.config.ts里添加:export default { // 其他已有配置 setupFiles: ['./setup-jest.js'], };
二、修复Jest环境销毁后的ReferenceError
这个报错是因为测试跑完后还有异步操作在跑,Jest销毁环境后它还在尝试导入模块。
- 检查你的
repository.test.ts,所有异步逻辑(比如数据库查询、Promise)必须用await等完,别让异步代码“裸奔” - 用了
fakeTimers的测试,记得最后调用jest.useRealTimers()恢复真实定时器,避免残留定时任务 - 测试结束后强制关闭数据库连接:在
repository.test.ts里加钩子:
确保import { closeDbConnection } from '../db/index'; afterAll(async () => { await closeDbConnection(); });db/index.ts里有对应的关闭方法,比如MongoDB用mongoose.connection.close(),MySQL用connection.end()
三、排查残留进程
- 给Jest加参数定位问题:修改package.json的test脚本:
运行测试后,Jest会告诉你哪些资源没释放,照着改就行"scripts": { "test": "jest --forceExit --detectOpenHandles" } - 检查
config/db.config.ts的连接逻辑,别在模块顶层直接创建持久连接(除非用了连接池且能自动回收)
内容的提问来源于stack exchange,提问作者patricK
相关产品推荐
相关产品推荐

