如何在 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')
我有一个控制器,它通过控制器构造函数中的依赖注入使用 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')