如何在Jest中Mock NestJS内置Logger并验证日志调用情况
问题解决方法
错误原因
你断言的对象是Logger类本身,它并不是Jest生成的Mock/Spy函数,你注册的Mock对象是作为Logger依赖的实际注入实例,需要先拿到这个实例再对它的方法做断言。
具体解决方案
有两种常用的实现方式:
方式1:提前定义Mock对象(更推荐,用起来更灵活)
- 在测试用例外层提前声明完整的Logger Mock对象,可根据你实际用到的Logger方法增减属性:
const mockLogger = { log: jest.fn(), error: jest.fn(), warn: jest.fn(), debug: jest.fn(), verbose: jest.fn() };
- 在测试模块的providers配置中直接使用这个预定义的Mock对象:
const module = await Test.createTestingModule({ controllers: [你的控制器], // 替换成你实际要测试的控制器类 providers: [ { provide: Logger, useValue: mockLogger } ] }).compile();
- 断言时直接调用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
相关产品推荐
相关产品推荐

