#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);
});