如何在 Jest 中模拟 NestJS 内置 Logger

Dav*_*ers 5 nestjs ts-jest

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

  constructor(private readonly logger: Logger) 
Run Code Online (Sandbox Code Playgroud)

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

providers[{
    provide: Logger,
    useValue: {
      log: jest.fn(),
    }
}]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这一行:

    expect(Logger).toHaveBeenCalledTimes(1);
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将不胜感激!

Jay*_*iel 13

在您的测试中,您应该使用(或非常类似的东西)将记录器从 DI 上下文中恢复出来moduleFixture.get(Logger),然后检查expect(logger.log).toHaveBeenCalledTimes(1). Logger它本身是一个类,而不是间谍或模拟,所以 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);
});
Run Code Online (Sandbox Code Playgroud)

然后在测试本身中:

expect(logger.log).toHaveBeenCalledTimes(1);
expect(logger.log).toHaveBeenCalledWith('Your log message here')
Run Code Online (Sandbox Code Playgroud)