如何在 Jest 中模拟 NestJS 内置的 Logger

How to mock NestJS built-in Logger in Jest

我有一个控制器,它通过控制器构造函数中的依赖注入使用 NestJS 内置记录器:

  constructor(private readonly logger: Logger) 

我希望能够在我的 Jest 测试中模拟它,以查看在日志记录期间调用了哪些方法和哪些参数。我试过这个语法:

providers[{
    provide: Logger,
    useValue: {
      log: jest.fn(),
    }
}]

在那种情况下,这一行:

    expect(Logger).toHaveBeenCalledTimes(1);

Returns: 匹配器错误:收到的值必须是模拟或间谍函数

非常感谢任何帮助!

在您的测试中,您应该使用 moduleFixture.get(Logger)(或非常相似的东西)将记录器从 DI 上下文中取回,然后检查 expect(logger.log).toHaveBeenCalledTimes(1)Logger 本身是一个 class,不是间谍或模拟,所以 Jest 不知道如何处理它。

有效的完整解决方案:

import { Test } from '@nestjs/testing';
let logger: Logger;

beforeEach(async () => {
  const moduleRef = await Test.createTestingModule({
    providers: [  
      {
        provide: Logger,
        useValue: {
          log: jest.fn(),
        },
      },
    ],
  }).compile();
  logger = moduleRef.get<Logger>(Logger);
});

然后在稍后的测试中:

expect(logger.log).toHaveBeenCalledTimes(1);
expect(logger.log).toHaveBeenCalledWith('Your log message here')