NestJS单元测试运行报错:测试启动后无法添加hook,hook需同步定义
报错产生原因
该报错是Jest测试框架的核心运行规则限制导致,报错信息如下:
Cannot add a hook after tests have started running. Hooks must be defined synchronously.
Jest要求所有测试相关API(包括beforeEach/afterEach/describe/it等)必须在测试脚本同步执行阶段完成注册,不能在测试启动、异步逻辑执行之后再动态注册钩子。你提供的测试代码中beforeEach的位置是符合规则的,因此问题大概率是以下场景触发:
- 测试文件内存在顶层await语句,顶层代码的异步执行会推迟后续钩子的注册时机,等Jest已经启动测试流程后才执行
beforeEach注册逻辑,触发报错 - 项目中存在多个版本的Jest依赖冲突
- TypeScript转译配置错误,导致钩子注册逻辑被包裹到异步函数中延迟执行
解决方案
按照排查优先级依次尝试以下操作:
- 检查当前测试文件的顶层作用域是否有
await调用:- 如果存在,把顶层await逻辑迁移到
beforeEach等测试钩子内部 - 若确实需要使用顶层await,给Jest启动命令添加参数
--experimental-vm-modules,同时在Jest配置中开启ESM支持
- 如果存在,把顶层await逻辑迁移到
- 消除Jest依赖版本冲突,执行对应包管理器的去重命令:
# npm npm dedupe jest # pnpm pnpm dedupe jest # yarn yarn dedupe jest - 若使用TypeScript+ts-jest,确认
tsconfig.json中target配置不低于ES2017,同时关闭不必要的惰性编译配置
内容的提问来源于stack exchange,提问作者Take
相关产品推荐
相关产品推荐

