模拟导入的模块以获得服务

时间:2020-09-02 07:10:17

标签: unit-testing mocking nestjs

假设我想为一个服务编写一个单元测试,该测试取决于另一个模块的服务。

现在这是我的问题。有什么方法可以编写测试,以便模拟MyService所依赖的模块,以便可以像这样在单元测试中使用它:

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

或者我必须为每个依赖项服务编写一个模拟并像这样使用它们:

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

1 个答案:

答案 0 :(得分: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();
});
...