【问题标题】:Angular/Karma/Jasmine unit test fails silently when error is thrownAngular/Karma/Jasmine 单元测试在抛出错误时静默失败
【发布时间】:2019-07-20 02:03:20
【问题描述】:

我有 Angular 拦截器拦截方法的 Karma/Jasmine 单元测试,它返回 rxjs Observable。如果成功回调单元测试有一些错误,即使它应该失败,它也会显示为通过。代码:

被测方法:

intercept(
  request: HttpRequest<any>,
  next: HttpHandler
): Observable<HttpEvent<any>> {
  ...

  return next.handle(req);
}

测试:

it("some test desc", () => {
  const headers = ...
  const request = new HttpRequest('GET', '/test', '', { headers });

  const next = jasmine.createSpyObj('HttpHandler', ['handle']);
  const errorResponse = new HttpErrorResponse({
    status: 401,
    error: 'SOME_ERROR_CODE'
  });

  next.handle.and.returnValue(throwError(errorResponse));

  console.log('before');
  interceptor.intercept(request, next).subscribe(
    () => fail('Observable should resolve with error.'),
    (res: HttpErrorResponse) => {
      console.log('in');
      throw new Error('some error happened here');
      expect(res).toBe(errorResponse);
    }
  );

  console.log('after');
});

我可以通过在错误回调结束时调用 done 来解决此问题,如描述 here,但我不明白为什么有必要,因为我的代码是同步执行的(由于使用 queueScheduler 的 rxjs throwError),它可以由执行日志的顺序(之前、之中、之后)来确认。

【问题讨论】:

    标签: angular unit-testing jasmine rxjs angular-test


    【解决方案1】:

    似乎 RxJS 捕捉到了订阅者抛出的错误,并在下一个滴答声中重新抛出。

    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多