ngrx router-store - тестирование эффектов навигации маршрутизатора

У меня есть следующие эффекты и тесты:

Эффект перенаправления входа

  @Effect()
  public loginSuccess$: Observable<Action> = this.actions$.pipe(
    ofType<LoginSuccess>(AuthActionTypes.LoginSuccess),
    map( action => action.payload ),
    concatMap( (payload: Client) => [
      new SecondAction(payload),
    ]),
    tap(() => this.router.navigate(['/somepage']))
  );

Проверка эффекта перенаправления входа

  describe('#loginSuccess$', () => {
    it('should trigger SecondAction action and redirect to somepage', () => {
      spyOn(effects['router'], 'navigate');

      actions = hot('-a-', { a: new LoginSuccess({} as any)});
      expected = cold('-b', { b: new SecondAction({} as any)});

      expect(effects.loginSuccess$).toBeObservable(expected);
      expect(effects['router'].navigate).toHaveBeenCalled();
    });
  });

Тесты проходят как положено. Я пытаюсь написать те же тесты для наблюдаемого действия, которое происходит в хранилище маршрутизаторов ngrx. Пример, вот мой Эффект.

Эффект clearError

  @Effect()
  public clearError$: Observable<Action> = this.actions$.pipe(
    ofType(ROUTER_NAVIGATION), // <-- not using the conventional 
    mapTo(new ClearErrorMessage())
  );

clearError EffectTest

  describe('#clearError$', () => {
    it('should trigger ClearErrorMessage action', () => {
      spyOn(effects['actions$'], 'pipe').and.returnValue(hot('-a', { a: ROUTER_NAVIGATION }));

      expected = cold('-b', { b: new ClearErrorMessage() });

      expect(effects.clearError$).toBeObservable(expected);
    });
  });

Однако здесь я получаю сообщение об ошибке:

Expected $.length = 0 to equal 1.
Expected $[0] = undefined to equal Object({ frame: 10, notification: Notification({ kind: 'N', value: ClearErrorMessage({ type: '[Auth] ClearErrorMessage' }), error: undefined, hasValue: true }) }).

Любые указатели были бы очень признательны


person Ian Jamieson    schedule 19.09.2018    source источник
comment
что такое ClearErrorMessage () ???   -  person ALGDB    schedule 20.09.2018
comment
@ALGDB, это внутреннее действие   -  person Ian Jamieson    schedule 20.09.2018


Ответы (1)


Вы также должны использовать actions, как в первом примере, вместо spyOn(...)

Также ROUTER_NAVIGATION - это просто строка, вам нужно будет создать действие.

describe('#clearError$', () => {
   actions$ = hot('-a---', { a: {type: ROUTER_NAVIGATION} });   
   expected = cold('-b', { b: new ClearErrorMessage() });
   expect(effects.clearError$).toBeObservable(expected);
});
person timdeschryver    schedule 20.09.2018