Кажется, что метод TestBed overrideModule удаляет ранее добавленных провайдеров - PullRequest
0 голосов
/ 10 января 2019

Заменяет ли TestBed.overrideModule ранее добавленных поставщиков?

У меня есть Component c1, в котором используется динамически созданный компонент c2. Я прочитал, что мне нужно использовать overrideModule, чтобы добавить entryComponents запись в 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. Я неправильно использовал overrideModule или ожидается поведение TestBed.overrideModule?

1 Ответ

0 голосов
/ 11 января 2019

Проблема была не в TestBed, а в том, как я настроил providers. Я использовал @Injectable({ providedIn: 'root'}) в файле .ts службы, а не в .ts модуля. Таким образом, даже если я настроил TestModule для использования предоставленной конфигурации ({provide:QuestionManagementService, useClass:MockQuestionManagementService}), кажется, что он продолжает выбирать экземпляр QuestionManagementService из корневого инжектора, пока я не переопределю его явно, вызвав TestBed.overrideProvider(QuestionManagementService,{useValue: new MockQuestionManagementService},);

Хотя мне все еще интересно, почему конфигурация, предоставленная для TestBed, не работала. Разве не выполняется поиск зависимостей от компонента к модулю и к корню?

...