Можно ли вызвать метод store.dispatch со строковым параметром в Angular 2 с хранилищем NgRx - PullRequest
0 голосов
/ 06 апреля 2020

Я получил тестовый костюм с несколькими тестовыми примерами и образец Angular 2 приложения с NgRx. Я не могу пройти один контрольный пример, и я не уверен, что этот контрольный пример корректен.

Мой вопрос: метод NgRx store.dispatch принимает строку в качестве параметра?

Если нет, тогда как этот тестовый пример может быть пройден?

Если да, можете ли вы помочь мне понять, как реализовать Action и редуктор в этом сценарии?

Тестовый случай в беде:

it('should dispatch action when dispatchAction is called', async() => {
  // you need to spy on store's 'dispatch' method
  store = TestBed.get(Store);
  spyOn(store, 'dispatch').and.callThrough();

  // if you call function dispatchAction with 'movies' paramter. expect store to dispatch action='movies'
  component.dispatchAction('movies');
  fixture.detectChanges();

  expect(store.dispatch).toHaveBeenCalledWith('movies');
});

Способ доставки компонента:

dispatchAction($event: string) {   
  // ToDo: need to write this.store.dispatch('movies') . But this method will not accept string parameter.
}

1 Ответ

1 голос
/ 06 апреля 2020

ОБНОВЛЕНО

Требуется [ 'movies' ], но фактические вызовы были [ Object({ type: 'movies' }) ]. Это означает, что приемная часть не поддерживает интерфейс действий ngrx. Поэтому нам нужно разбить типы здесь для отправки с any cast.

dispatchAction($event: string) {   
  this.store.displatch($event as any);
}

, если тест fre sh или вы знаете его автора, я бы рекомендовал обсудить с ним решение, потому что правильный способ - отправить объект, который соответствует интерфейсу Action, вы можете найти его здесь, он имеет просто свойство типа string: https://github.com/ngrx/platform/blob/667b5b3bf2a30429a5a85f61cfdcf10fa8ff3199/modules/store/src/models.ts#L1 -L3

Утверждение должно выглядеть следующим образом:

expect(store.dispatch).toHaveBeenCalledWith(
  jasmine.objectContaining({
    type: 'movies',
  }),
);

ORIGINAL

для отправки действия movies просто используйте клавишу type интерфейса действия:

dispatchAction($event: string) {   
  this.store.displatch({type: $event});
}
...