Компонент модульного тестирования Angular с действием отправки хранилища

#javascript #angular #unit-testing #ngrx

#javascript #angular #модульное тестирование #ngrx

Вопрос:

У меня есть компонент, который имеет следующую функцию:

 onClearSearch() {
  this.store$.dispatch(some action);
}
  

Попытка модульного тестирования компонента и запуска отправки хранилища не работает. Мой компонентный тест выглядит следующим образом:

 let store: MockStore<State>;

beforeEach(waitForAsync(() => {
  TestBed.configureTestModule({
    ...
    providers: [
      SearchStoreEffects,
      provideMockActions(() => actions$),
      provideMockStore({initialState, selectors: [...]})
    ],
    ...
  }).compileComponents();

  ...
  store = TestBed.inject(MockStore);
  fixture.detectChanges();
}));

it('should clear search value', () => {
  const storeSpy = spyOn(store, 'dispatch').and.callThrough();
  component.onClearSearch();
  fixture.detectChanges();
  expect(storeSpy).toHaveBeenCalledTimes(1);
});
  

Тест всегда завершается неудачей, когда test вызывался ноль раз. Чего мне не хватает?

Ответ №1:

Вам нужно следить за экземпляром компонента

 it('should clear search value', () => {
  const storeSpy = spyOn(component.store$, 'dispatch').and.callThrough();
  component.onClearSearch();
  fixture.detectChanges();
  expect(storeSpy).toHaveBeenCalledTimes(1);
});
  

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

1. Что это за сообщение об ошибке?

2. То же самое: «Ожидаемая отправка spy была вызвана один раз. Он был вызван 0 раз. »

3. Если я оберну утверждение it в fakeAsync, затем вызовите tick после component.onClearSearch(); , это сработает

4. Если вы не хотите исправлять его, ожидайте, сколько раз он был вызван… вы можете просто использовать expect(storeSpy).toHaveBeenCalled(); .

Ответ №2:

Если я оберну утверждение it в fakeAsync, затем вызовите tick после component.onClearSearch(); , это сработает