引发错误时,Angular / Karma / Jasmine单元测试将以静默方式失败

时间:2019-02-26 13:50:06

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

我对返回rxjs Observable的Angular拦截器拦截方法进行了Karma / Jasmine单元测试。如果成功存在一些错误,则回调单元测试应该会通过,即使它应该失败。代码:

正在测试的方法:

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');
});

我可以通过在错误回调的末尾如描述here调用完成来解决此问题,但是由于我的代码是同步执行的,所以我不明白为什么有必要这样做(由于使用queueScheduler导致了rxjs throwError)可以通过执行日志的顺序(之前,之后,之后)来确认。

1 个答案:

答案 0 :(得分:0)

RxJS似乎捕获了从订户抛出的错误,并在下一个刻度中将其重新抛出。