Как написать модульный тест для получения эффекта при сбое в angular

#angular #unit-testing #rxjs-marbles

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

Вопрос:

У меня есть loadUserCacheRequestEffect$ effect

 loadUserCacheRequestEffect$ = createEffect(() =>
  this.actions$.pipe(
    ofType(ActionTypes.USER_SESSION_CACHE_REQUEST),
    switchMap(() => this.taskCacheKeyService.getCacheUserSessionData()
    .pipe(
        switchMap((sessionData: TaskCacheKey) => [
          ActionTypes.USER_SESSION_CACHE_SUCCESS({ sessionData }),
          ActionTypes.TASK_DETAILS_REQUEST({
            taskId: sessionData.taskId,
            templateNumber: sessionData.templateId
          })
        ]),
        catchError((err) => {
          return of(ActionTypes.USER_SESSION_CACHE_FAILURE({error: err.error.detail}));
        })
      ))
    )
  );
  

Я написал модульный тест для случая успеха, который работает

 it('loadUserCacheRequestEffect should return USER_SESSION_CACHE_SUCCESS and TASK_DETAILS_REQUEST actions', () => {
    actions$ = hot('a', { a: fromActions.USER_SESSION_CACHE_REQUEST() });
    const expected = cold('(bc)', {
      b: fromActions.USER_SESSION_CACHE_SUCCESS({
        sessionData: userSessionDataMock
      }),
      c: fromActions.TASK_DETAILS_REQUEST({
        taskId: userSessionDataMock.taskId,
        templateNumber: userSessionDataMock.templateId
      })
    });
    expect(effects.loadUserCacheRequestEffect$).toBeObservable(expected);
  });
  

Я хотел бы написать модульный тест при сбое эффекта и вернуть ActionTypes.USER_SESSION_CACHE_FAILURE({ошибка: err.error.detail})

Ответ №1:

Это должно выполнить задание, если нет, то вам нужно выровнять шарики:

   it('should handle error', () => {
    actions$ = hot('a', {a: fromActions.USER_SESSION_CACHE_REQUEST()});
    taskCacheKeyServiceSpy.getCacheUserSessionData.and.returnValue(cold('-#', {}, {error: {details: 'something'}}));

    const expected = cold('-b', {
      c: ActionTypes.USER_SESSION_CACHE_FAILURE({error: err.error.detail})
    });

    expect(effects.loadUserCacheRequestEffect).toBeObservable(expected);
  });
  

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

1. Он работает, просто требуется небольшая коррекция, например {error: {details: ‘something’}} здесь подробно описывается ожидаемая замена c на b

2. @devverma Я скопировал этот тест из своих тестов, но, вероятно, пропустил некоторые места, которые следует скорректировать 🙂

Ответ №2:

Это рабочий пример после некоторой коррекции:

 it('it should handle error', () => {
        actions$ = hot('a', {a: fromActions.USER_SESSION_CACHE_REQUEST()});
        const taskCacheKeyServiceSpy = spyOn(taskCacheKeyService, 'getCacheUserSessionData');
        taskCacheKeyServiceSpy.and.returnValue(cold('-#', {}, {error: {detail: 'something'}}));
        const expected = cold('-b', {
          b: fromActions.USER_SESSION_CACHE_FAILURE({error: 'something'})
        });
        expect(effects.loadUserCacheRequestEffect$).toBeObservable(expected);
      });