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

如何在Jest中Mock NestJS内置Logger并验证日志调用情况

问题解决方法

错误原因

你断言的对象是Logger类本身,它并不是Jest生成的Mock/Spy函数,你注册的Mock对象是作为Logger依赖的实际注入实例,需要先拿到这个实例再对它的方法做断言。

具体解决方案

有两种常用的实现方式:

方式1:提前定义Mock对象(更推荐,用起来更灵活)

  1. 在测试用例外层提前声明完整的Logger Mock对象,可根据你实际用到的Logger方法增减属性:
const mockLogger = {
  log: jest.fn(),
  error: jest.fn(),
  warn: jest.fn(),
  debug: jest.fn(),
  verbose: jest.fn()
};
  1. 在测试模块的providers配置中直接使用这个预定义的Mock对象:
const module = await Test.createTestingModule({
  controllers: [你的控制器], // 替换成你实际要测试的控制器类
  providers: [
    {
      provide: Logger,
      useValue: mockLogger
    }
  ]
}).compile();
  1. 断言时直接调用Mock对象上的对应方法即可:
// 验证log方法调用次数
expect(mockLogger.log).toHaveBeenCalledTimes(1);
// 验证log方法传入的参数
expect(mockLogger.log).toHaveBeenCalledWith('你预期的日志内容');

方式2:从测试模块中获取注入的Logger实例

如果你不想提前定义Mock对象,也可以在测试模块编译完成后,直接从容器中取出Logger实例再做断言:

const module = await Test.createTestingModule({
  controllers: [你的控制器],
  providers: [
    {
      provide: Logger,
      useValue: {
        log: jest.fn()
      }
    }
  ]
}).compile();

// 从测试模块容器中获取Logger的实际注入实例
const logger = module.get<Logger>(Logger);

// 直接断言实例上的方法
expect(logger.log).toHaveBeenCalledTimes(1);

内容的提问来源于stack exchange,提问作者Dave Anders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 11:45:04