angular - 期望在 Angular / Karma / Jasmine 的测试中可观察到失败
问题描述
我有一个组件,它最终通过连续调用一堆 HTTP 服务来switchMap
从后端获取数据。
我想测试错误处理部分。该应用程序具有全局错误处理 (ErrorHandler) 和通过 catchError 进行的本地错误处理。
测试方法如下所示:
public methodUsingObservable() {
this.someRequest()
.pipe(catchError((error) => this.handleError(error)))
.subscribe(console.log);
}
处理错误检查错误是否链接到业务操作,并再次将其抛出以由全局处理程序处理
handleError(error) {
checkLocally(error);
return throwError(error);
}
对于我的测试,我模拟someRequest
了throwError
后端调用的问题
it('should handle the error when one occurs', fakeAsync(() => {
const service: MachinService = TestBed.get(MachinService);
spyOn(service,'someRequest').and.returnValue(throwError(new Error("Failing HTTP call")));
spyOn(service,'handleError').and.callThrough();
service.methodUsingObservable();
tick();
expect(service.methodUsingObservable).toThrowError();
expect(service.handleError).toHaveBeenCalled();
}));
然而,无论我如何监视和期待某事,Karma 一直认为测试是失败的,因为订阅,正如实际预期的那样,抛出一个未处理的错误。
我试过了:
expect(service.methodUsingObservable).toThrowError();
expect(service.methodUsingObservable()).toThrowError();
expect(() => service.methodUsingObservable()).toThrowError();
但似乎没有人教系统接受测试成功,而测试失败。
Chrome 62.0.3202 (Windows 10.0.0) MachinService should handle the error when one occurs FAILED
Error: Failing HTTP call
at UserContext.<anonymous> src/app/shared/services/machin.service.spec.ts:12:64)
...
在这些条件下,如何将测试标记为通过?
解决方案
好吧,一种方法是删除catchError
并实际处理订阅中的错误,甚至不必抛出错误:
subscribe(
(success)=>{},
(error)=>checkLocally(error))
)
这样,您将能够returnValue(throwError())
在Spy
并且fakeAsync
不会抱怨,因为错误将得到处理。
推荐阅读
- swift - Swift - 我如何遍历一组可跨变量的所有可能性
- r - 将远程 SQL Server 连接到 R 时出错
- php - Vuejs - 在 vue 项目中设置无头 wordpress
- html - 如何使嵌套的 div 可点击?
- python-3.x - 通过 Python 中的用户输入获取枚举成员
- buildroot - Buildroot 外部工具链选择
- ionic-framework - 无法在 Sentry for Ionic 应用程序中访问源映射
- php - phpDocumentor 在我的代码中找不到 TODO 标记?
- parsing - Prolog 中的一元解析器(示例 DIMACS 文件)
- c++ - 不能使用字符串来命名我要创建的文件