Имитация импортированных модулей для сервиса

#unit-testing #mocking #nestjs

#модульное тестирование #имитация #nestjs

Вопрос:

Предположим, я хочу написать модульный тест для службы, которая зависит от служб другого модуля.

Теперь вот мой вопрос. Есть ли какой-либо способ написать мой тест, чтобы я издевался над модулем, от которого MyService зависит, чтобы я мог использовать его в своем модульном тестировании следующим образом:

 const moduleRef = await Test.createTestingModule({
    imports: [
        MockedModule,
    ],
    providers: [
        MyService,
    ],
});
  

Или я должен написать макет для каждой службы зависимостей и использовать их следующим образом:

 const moduleRef = await Test.createTestingModule({
    providers: [
        MyService,
        {
            provider: DependencyService,
            useClass: DependencyServiceMock,
        }
    ],
});
  

Ответ №1:

Я полагаю, было бы возможно использовать MockModule , который предоставляет и экспортирует те же зависимости, от которых обычно зависит служба. Я еще не слышал, чтобы кто-то пытался это сделать, но я не понимаю, почему это не сработает. Итак, если у вас есть

 @Injectable()
export class MyService {
  constructor(private readonly depService: DependencyService) {}
...
}
  

Затем в вашем макетном модуле вам понадобится

 @Module({
  providers: [{
    provide: DependencyService,
    useClas: DependencyServiceMock,
  }],
  exports: [DependencyService],
})
export class MockedModule {}
  

И в вашем тесте вам нужно было бы сделать

 beforeEach(async () => {
  const app = await Test.createTestModule({
    imports: [MockedModule],
    providers: [MySerivce],
  }).compile();
});
...