繁体   English   中英

如何在nestjs单元测试中模拟nest-winston logger依赖

[英]How to mock a nest-winston logger dependency in nestjs unit tests

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

我想模拟一个nest-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();
    // ...
  }
}

作者的解决方案是将记录器令牌作为提供者传递给具有空 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 文档中描述的自动 mocking对我也不起作用。

我对 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 ,那么模拟logjest.fn()是一个很好的方法。

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

这将允许您的代码运行,并且没有任何内容可以从记录器注销到控制台。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM