Angular服务http.get错误处理测试异常:始终进入next回调
问题分析与解决
你的测试用例始终进入next回调的原因很明确:你用of(errorResponse)返回的是一个正常发射数据的Observable,它会把HttpErrorResponse当作普通的next值传递,而不是触发error回调。
Angular的HttpService在请求失败时,会返回一个抛出错误的Observable,而非将HttpErrorResponse作为正常数据发射。所以你的mock逻辑不符合真实的HttpService行为。
修正方案
把of(errorResponse)替换为RxJS的throwError方法,它会创建一个直接抛出错误的Observable,这样就能触发subscribe的error回调。
修正后的测试代码
import { throwError } from 'rxjs'; it('should handle error when retrieving document details', () => { const errorResponse = new HttpErrorResponse({ error: 'error', status: 500 }); spyOn(service['http'], 'get').and.returnValue(throwError(() => errorResponse)); service.getDocumentDetails('case1', 'doc1').subscribe({ next: () => fail('expected an error, not document details'), error: error => expect(error.message).toContain('error') }); expect(service['http'].get).toHaveBeenCalledWith(UrlConstants.CASES_URL + '/case1/Documents/doc1/Details'); });
额外说明
- 确保你已经导入了
throwError操作符,它属于RxJS的核心操作符。 - 如果使用RxJS 5.x版本,对应写法是
Observable.throw(errorResponse),但RxJS 6+已统一使用throwError。
内容的提问来源于stack exchange,提问作者CJe
相关产品推荐
相关产品推荐

