如何通过测试到达 catchError 运算符
How to reach catchError operator with testing
我试图从我的代码中覆盖 catchError
个块,但我尝试了很多方法,其中 none 个确实有效。除了所有 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();
});
编辑:上面的规范文件只是我尝试过的众多片段之一,我不明白为什么这不起作用。任何建议将不胜感激。另外,我可以使用 effects.get$.subscribe 来测试 catchError,但由于某种原因,它在代码覆盖率上被跳过了,这对这种情况来说是一个问题。
非常感谢!
使用throwError
代替of
spyOn(httpService, 'get').and.returnValue(throwError(mockError));
我试图从我的代码中覆盖 catchError
个块,但我尝试了很多方法,其中 none 个确实有效。除了所有 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();
});
编辑:上面的规范文件只是我尝试过的众多片段之一,我不明白为什么这不起作用。任何建议将不胜感激。另外,我可以使用 effects.get$.subscribe 来测试 catchError,但由于某种原因,它在代码覆盖率上被跳过了,这对这种情况来说是一个问题。
非常感谢!
使用throwError
代替of
spyOn(httpService, 'get').and.returnValue(throwError(mockError));