如何在nestjs单元测试中模拟嵌套的winston记录器依赖关系



这个问题已经存在,但它被标记为已解决,该解决方案对我来说根本不起作用。

我想模拟一个嵌套winston记录器,它是nestjs中提供者的依赖项。

@Controller('builder/instance')
export class InstanceController {
private executor: Executor;
constructor(
@Inject(WINSTON_MODULE_NEST_PROVIDER) private readonly logger: Logger,
private stripeService: StripeService,
private instanceService: InstanceService,
private organizationService: OrganizationService,
private executorFactory: ExecutorFactory,
private socketService: SocketService,
private auditLogService: AuditLogService,
) {
this.logger.log("hello world!", InstanceController.name);
this.executor = this.executorFactory.getExecutor();
// ...
}
}

authors的解决方案是将loggers令牌作为提供程序传递给useValue为空的模块。我想这是因为他们不想真正调用它,而只是为他们嘲笑的一个提供者提供依赖关系。

describe('InstanceController', () => {
let controller: InstanceController;
const mockStripeService = {};
const mockInstanceService = {};
const mockOrganizationService = {};
const mockExecutorFactory = {};
const mockSocketService = {};
const mockAuditLogService = {};
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
// imports: [AccountModule],
controllers: [InstanceController],
providers: [
{ provide: WINSTON_NEST_MODULE_PROVIDER, useValue: {} },
StripeService,
InstanceService,
OrganizationService,
ExecutorFactory,
SocketService,
AuditLogService,
],
})
.overrideProvider(StripeService)
.useValue(mockStripeService)
.overrideProvider(InstanceService)
.useValue(mockInstanceService)
.overrideProvider(OrganizationService)
.useValue(mockOrganizationService)
.overrideProvider(ExecutorFactory)
.useValue(mockExecutorFactory)
.overrideProvider(SocketService)
.useValue(mockSocketService)
.overrideProvider(AuditLogService)
.useValue(mockAuditLogService)
.compile();
controller = module.get<InstanceController>(InstanceController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});

然而,当尝试运行测试时,它会尝试查找this.logger.log,当this.logger返回为{}时,它表示this.logger.log is not a function。有人知道正确模拟记录器依赖关系的方法吗?有人能帮我吗?nestjs文档中描述的自动嘲讽对我来说也不起作用。

我对jest和nestjs很陌生,因此我的石膏解决方案是用替换空的useValue

{
log: jest.fn(),
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
}

,这只是。。。很坏的我们将非常感谢您的帮助!

首先,我建议不要设置每个提供程序,然后使用override提供程序。相反,使用像这样的简单自定义提供者

{
provide: StripeService,
useValue: mockStripeService
}

当你有这么多服务的时候,样板就更少了。我保留了用于集成和e2e测试的override*()方法,在这些方法中,我需要覆盖由另一个模块注册的提供程序。

其次,如果您最终在方法中使用的只是this.logger.log,那么将log模拟为jest.fn()是一种很好的方法。

{
provide: WINSTON_NEST_MODULE_PROVIDER,
useValue: { log: jest.fn() }
}

这将允许您的代码运行,而无需从记录器注销到控制台。

最新更新