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

#angular #redux #jasmine

#angular #сокращение #jasmine

Вопрос:

Я пытаюсь создать два разных макетных поставщика и spys для классов, которые вводятся в мой компонент. Зависимости относятся к одному и тому же классу, но используют другой набор текста, используя общие.

 constructor(
private readonly languageStore: Store<fromLanguageStore.LanguageState>,
private readonly userStore: Store<fromUserStore.UserState>) {}
 

component.ts

Я пробовал следующее;

 providers: [
    {
      provide: Store<fromLangaugeStore.LanguageState>,
      useValue: languageStoreMock
    },
    {
      provide: Store<fromUserStore.UserState>,
      useValue: userStoreMock
    }
  ]
 

component.spec.ts

В файле спецификации невозможно выполнить вышеуказанное. Я также пытался использовать одного поставщика и использовать spyOn следующим образом;

 spyOn(storeMock, 'pipe').and.callFake((func) => {
  //
})
 

но в метод передается функция select() '@ngrx/store' , и я не вижу, как переключить то, что возвращается поддельным, на основе метода, поскольку они оба передают select, но аргумент отличается, т.е.

 this.languageStore.pipe(select(fromLanguageStore.getLanguageContext))
this.userStore.pipe(select(fromUserStore.getUserContext))
 

Ответ №1:

Мне странно, что вы вводите Store дважды в свой компонент. Я бы просто ввел его один раз вот так:

 constructor(
private readonly store: Store<fromLanguageStore.LanguageState | fromUserStore.UserState>) {}
 

Хранилище — это одна база данных, и в любое время, когда вам нужно languageState , вы можете сделать:

 languageState$ = this.store.select(....); // select the language state from the store
userState$ = this.store.select(....); // select the user state from the store
 

Таким образом, вам нужно будет создать макет только Store один раз.

Редактировать

Я предоставляю хранилище и провожу интеграционное тестирование, чтобы имитировать разные фрагменты хранилища.

 TestBed.configureTestingModule({
  declarations: [AppComponent, BookListComponent, BookCollectionComponent],
  imports: [
    HttpClientTestingModule,
    StoreModule.forRoot({
      books: booksReducer,
      collection: collectionReducer,
    }),
  ],
  providers: [GoogleBooksService],
}).compileComponents();
 
fixture = TestBed.createComponent(AppComponent);
component = fixture.debugElement.componentInstance;
store = TestBed.inject(Store);  // get a handle on the store
store.dispatch(new SetUsers(...)); // put the users you want in the ...
store.dispatch(new SetLanguage(...)); // put the language state you want in the ... // after doing the above lines, your store should be populated with what you want
fixture.detectChanges();
 

Проверьте эту ссылку.

Комментарии:

1. Рассмотрим метод в компоненте, который использует оба состояния, как бы вы это высмеяли? Я понимаю, что вы сделали с DI и т. Д.