这个问题已经存在,但它被标记为已解决,该解决方案对我来说根本不起作用。
我想模拟一个嵌套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() }
}
这将允许您的代码运行,而无需从记录器注销到控制台。