Nest.js测试报错:已继承ConsoleLogger仍提示禁止继承Logger
错误出现的原因
- 开发环境正常是因为你在
NestFactory.create阶段手动传入了实例化的ReportLogger,直接覆盖了Nest默认的日志实现,不会触发旧版Logger的校验逻辑。 - 测试场景下默认没有配置自定义Logger,
Test.createTestingModule在编译模块时会自动扫描所有Provider的日志实现,只要检测到任何继承自旧版Logger类的用法就会抛出该错误,常见的隐性触发场景包括:- 某个业务代码中还有直接实例化/注入
@nestjs/common导出的旧版Logger类的写法 - 你的
ReportLogger没有在测试模块中注册,Nest默认fallback到了旧版日志校验逻辑 - 你在测试实例化应用时没有传入和生产一致的日志配置
- 存在以旧版
Logger作为依赖注入键的Provider声明
- 某个业务代码中还有直接实例化/注入
修复步骤
- 全局检查所有业务代码的Logger导入,确保所有日志相关的实例化、继承都使用
@nestjs/common导出的ConsoleLogger,而非旧版Logger。 - 调整测试代码,给测试模块和测试应用配置和
main.ts一致的自定义Logger:
const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], }) // 给测试模块指定自定义Logger .setLogger(new ReportLogger()) .compile(); // 实例化测试应用时传入相同的日志配置 app = moduleFixture.createNestApplication({ bufferLogs: true, logger: new ReportLogger(), });
- 排查
AppModule的Provider声明:- 如果将
ReportLogger声明为全局Provider,补充完整的声明避免Nest误识别:{ provide: ReportLogger, useClass: ReportLogger } - 如果存在以旧版
Logger作为注入键的写法,替换为自定义Token或者ConsoleLogger:// 错误写法,会触发校验 { provide: Logger, useClass: ReportLogger } // 修正后写法 { provide: 'REPORT_LOGGER', useClass: ReportLogger }
- 如果将
- 如果排查后还是报错,可以临时将测试用的Logger替换为内置的
ConsoleLogger验证,如果替换后不再报错,说明你的ReportLogger实现中仍有未排查到的旧版Logger引用。
内容的提问来源于stack exchange,提问作者Sea Monster
相关产品推荐
相关产品推荐

