如何通过测试到达catchError运算符

问题描述 投票:0回答:1

我正在尝试从我的代码中涵盖catchError块,但是我尝试了许多方法,但实际上都没有。除所有catchError块外,我的代码均已正确覆盖!有一些我不知道的魔术功能吗?

这里是一些示例代码。

some.effects.ts

 get$ = createEffect(() =>
  this.actions$.pipe(
    ofType(myActions.Get),
    switchMap(({ payload }) => {
      return this.httpService.get(payload).pipe(
        map(res => myActions.Loaded({ payload: res })),
        catchError(() => {
          localStorage.removeItem('someItem');
          return of(myActions.Create()))
        }
      );
    })
  )

);

some.effects.spec.ts

  it('get$ fails', () => {

    function mockError() {
      return new HttpErrorResponse({
        error: 'error', 
        headers: new HttpHeaders(),
        status: 404
      });
    }

    spyOn(httpService, 'get').and.returnValue(of(mockError));

    actions$ = hot('--a', { a: myActions.Get({}) });
    completion$ = cold('--c', { c: myActions.Create({}) });

    expect(effects.get$).toBeObservable(completion$);
    expect(localStorage.removeItem).toHaveBeenCalled();
  });

编辑:上面的spec文件只是我尝试的许多代码片段之一,我不明白为什么它不起作用。任何建议将不胜感激。另外,我可以使catchError可以使用effects.get $ .subscribe进行测试,但是由于某种原因,它在代码覆盖率上被跳过了,在这种情况下是一个问题。

谢谢一堆!

unit-testing rxjs karma-jasmine
1个回答
0
投票

使用throwError代替of

spyOn(httpService, 'get').and.returnValue(throwError(mockError));
© www.soinside.com 2019 - 2024. All rights reserved.