我有一项服务可以执行以下操作:
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()
函数的情况下,我无法在其他任何地方找到关于如何模拟错误响应的信息。
答案 0 :(得分:1)
你做错了。正如HttpClient文档所述,除2XX-3XX响应代码之外的任何内容都将处理为错误:
可能发生两种类型的错误。服务器后端可能会拒绝该请求,返回状态代码为404或500的HTTP响应。这些是错误响应。
或者在客户端出现问题,例如网络错误 这会阻止请求成功完成或异常 扔在RxJS运算符中。这些错误产生JavaScript ErrorEvent 对象。
HttpClient在其HttpErrorResponse中捕获两种错误 你可以检查一下这个反应,找出真正发生的事情。
所以基本上你在map
中的条件是死代码。