首页 > 解决方案 > 期望在 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);
  }

对于我的测试,我模拟someRequestthrowError后端调用的问题

  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)
    ...

在这些条件下,如何将测试标记为通过?

标签: angularunit-testingrxjskarma-jasmine

解决方案


好吧,一种方法是删除catchError并实际处理订阅中的错误,甚至不必抛出错误:

subscribe(
    (success)=>{},
    (error)=>checkLocally(error))
)

这样,您将能够returnValue(throwError())Spy并且fakeAsync不会抱怨,因为错误将得到处理。


推荐阅读