TestBed overlayModule方法似乎删除了以前添加的提供程序

时间:2019-01-10 18:58:43

标签: angular6 angular-test

TestBed.overrideModule是否替换以前添加的提供者?

我有一个Component c1,它使用动态创建的组件c2。我读到我需要使用overrideModuleentryComponents中添加TestBed条目。

所以我做到了

TestBed.configureTestingModule({
  declarations: [ NewPracticeQuestionComponent,
  DialogBoxComponent,
    ShowErrorsComponent],
  imports:[ReactiveFormsModule,HttpClientTestingModule],
  providers:[WebToBackendInterfaceService,
    HelperService,
    AuthService,
    {provide:QuestionManagementService, useClass:MockQuestionManagementService}] //NOTE I HAVE A DIFFERENT PROVIDER HERE
});
TestBed.overrideModule(BrowserDynamicTestingModule, {
  set: {
    entryComponents: [DialogBoxComponent]/*DialogBoxComponent is created dynamically (imperatively), soit nee to be ddded in entryComponent*/
    }
  });
TestBed.compileComponents();

以上,我提供了MockQuestionManagementService作为QuestionManagementService的其他提供者。但是我注意到,在创建组件时,Angular创建了QuestionManagementService !!

要解决此问题,我必须明确致电TestBed.overrideProvider

    TestBed.configureTestingModule({
      declarations: [ NewPracticeQuestionComponent,
      DialogBoxComponent,
        ShowErrorsComponent],
      imports:[ReactiveFormsModule,HttpClientTestingModule],
      providers:[WebToBackendInterfaceService,
        HelperService,
        AuthService,
        {provide:QuestionManagementService, useClass:MockQuestionManagementService}]
    });
    TestBed.overrideModule(BrowserDynamicTestingModule, {
      set: {
        entryComponents: [DialogBoxComponent]/*DialogBoxComponent is created dynamically (imperatively), soit nee to be ddded in entryComponent*/
        }
      });
    TestBed.overrideProvider(QuestionManagementService,{useValue: new MockQuestionManagementService},); //THIS ADDED EXPLICITLY
    TestBed.compileComponents();
  }));

现在Angular添加了MockQuestionManagementService。我是否错误地使用了overrideModuleTestBed.overrideModule的预期行为?

1 个答案:

答案 0 :(得分:0)

问题不在于TestBed,而是我配置providers的方式。我在服务的@Injectable({ providedIn: 'root'})文件而不是模块的.ts中使用了.ts。因此,即使我将TestModule配置为使用提供的配置({provide:QuestionManagementService, useClass:MockQuestionManagementService}),除非我通过调用{{ 1}}

尽管我仍然想知道为什么提供给QuestionManagementService的配置不起作用。不是查找从组件到模块再到根的依赖关系吗?