我怎样才能抑制 Api 错误和 return 一个值呢?

How can i supress Api error and return a value instead?

我从 API 收到未使用的 404 和已用电子邮件的 204。现在我想使用 rxjs/pipecatchError.

将其转换为 boolean (true/false)
emailAvailable(): Observable<boolean> {
  return this.api.email(email).pipe(
    map((response: HttpResponse<any>) => {
      return false; // used email > false
    }),
    catchError((err: HttpErrorResponse) => {
      if (err.status === 404) {
        return of(true); // unused > true
      }
      throw err;
    })
  );
}

现在在我的单元测试中,我遇到了这样定义的未使用电子邮件的情况

when(mockApi.email('unused@example.com')).thenThrow(
  new HttpErrorResponse({status: 404, statusText: 'E-Mail not in use', error: { message: 'E-Mail not in use'}}));

然后它尝试像这样编写我的测试。

it('should validate for unused email', async() => {
    expect(await readFirst(emailService.emailAvailable('unused@example.com'))).toBe(true);
});

现在测试失败了,因为抛出 HttpErrorResponse:

 ● EmailValidator › should validate form for unused email
    HttpErrorResponse: Http failure response for (unknown url): 404 E-Mail not in use

所以 Observable 抛出了我认为我用 catchError 发现的错误。 我的测试设置是 jest,我不想(也不能)切换到 TestBed。

对我有帮助的是这个Post:

“抛出错误”路径应该 return 错误在“of”中,这样​​它也可以测试。

模拟可以这样结束:

when(mockApi.email('unused@example.com')).thenReturn(
  throwError(new HttpErrorResponse(
    { status: 404, statusText: 'E-Mail not in use', error: { message: 'E-Mail not in use'} } 
)));

在该测试中,您可以检查您的值或错误消息