TestBed overrideModule method seem to remove previously added providers

折月煮酒 提交于 2019-12-25 03:32:51

问题


Does TestBed.overrideModule replace previously added providers?

I have a Component c1 which uses a dynamically created component c2. I read that I need to use overrideModule to add entryComponents entry in the TestBed.

So I did this

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();

Above, I have provided MockQuestionManagementService as different provider for QuestionManagementService. But I notice that when creating the component, Angular created QuestionManagementService!!

to fix the problem, I had to explicitly call 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();
  }));

Now Angular added the MockQuestionManagementService. Did I incorrectly use overrideModule or it is expected behaviour of TestBed.overrideModule?


回答1:


The issue was not with TestBed but with the way I had configured the providers. I had used @Injectable({ providedIn: 'root'}) in the service's .ts file rather than in module's .ts. So even if I configured the TestModule to use the provided configuration ({provide:QuestionManagementService, useClass:MockQuestionManagementService}), it seems it kept picking the instance of QuestionManagementService from the root injector unless I explicitly override it by calling TestBed.overrideProvider(QuestionManagementService,{useValue: new MockQuestionManagementService},);

Though I still wonder why the configuration provided to the TestBed didn't work. Isn't the lookup for dependencies from Component to Module to Root?



来源:https://stackoverflow.com/questions/54135268/testbed-overridemodule-method-seem-to-remove-previously-added-providers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!