模拟HTTP错误响应

时间:2018-02-28 15:06:18

标签: angular unit-testing jasmine

我有一项服务可以执行以下操作:

  public fetchStuff(): Observable<MyModel> {
    const url = `httpURLHere`;

    return this.httpClient.get(url, { observe: 'response' }).pipe(
      map((res: any) => {
        console.warn(res);
        if ((res.status === 200 && res.body === null) || res.status === 404) {
          throw new Error("Error getting stuff");
        } else if (res.status === 500) {
          throw new Error("Error with API");
        } else {
          return <MyModel>res.body;
        }
      }),
      catchError(this.handleError)
    );
  }

  private handleError(error: Response | any) {
    console.error(error.message || error);

    return new ErrorObservable(error.message || error);
  }

我希望能够测试fetchStuff()函数中的逻辑;事实证明这比我最初想象的要困难 - 因为使用:

httpMock.expectOne(url).error(new ErrorEvent('ERROR'), { status: 404 });

跳过内部逻辑并直接跳转到handleError()函数;和

httpMock.expectOne(url).flush(null, { status: errorStatus, statusText: 'ERROR' });

会将{status, statusText}放入回复的body

在没有直接跳转到handleError()函数的情况下,我无法在其他任何地方找到关于如何模拟错误响应的信息。

1 个答案:

答案 0 :(得分:1)

你做错了。正如HttpClient文档所述,除2XX-3XX响应代码之外的任何内容都将处理为错误:

  

可能发生两种类型的错误。服务器后端可能会拒绝该请求,返回状态代码为404或500的HTTP响应。这些是错误响应。

     

或者在客户端出现问题,例如网络错误   这会阻止请求成功完成或异常   扔在RxJS运算符中。这些错误产生JavaScript ErrorEvent   对象。

     

HttpClient在其HttpErrorResponse中捕获两种错误   你可以检查一下这个反应,找出真正发生的事情。

所以基本上你在map中的条件是死代码。