【问题标题】:How to write unit test for effect when it fails in angular当角度失败时如何编写单元测试以确保效果
【发布时间】:2020-12-21 15:13:41
【问题描述】:

我有 loadUserCacheRequestEffect$ 效果

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({error: err.error.detail})

【问题讨论】:

    标签: angular unit-testing rxjs-marbles


    【解决方案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);
      });
    

    【讨论】:

    • 它正在工作,只需要像 {error: {details: 'something'}} 这样的一点点更正,这里的细节是细节在预期中将 c 替换为 b
    • @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);
          });
    

    【讨论】:

      猜你喜欢
      • 2013-12-05
      • 2018-11-18
      • 2023-01-22
      • 2022-11-04
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多