角度:测试拦截器正确的请求顺序

时间:2019-09-09 08:45:30

标签: angular unit-testing rxjs karma-jasmine

考虑以下拦截器示例

except:

目的是将http请求延迟到刷新令牌解决为止。

这是对此方法的测试。

export class RefreshTokenInterceptor implements HttpInterceptor {
  private isRefreshing = false;
  private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);

  constructor(private jwtService: JwtService) { }

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

    if (this.jwtService.isExpired()) {
      return this.handleTokenRefresh(request, next);
    }

    return next.handle(request);
  }

  private handleTokenRefresh(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (!this.isRefreshing) {
      this.isRefreshing = true;
      this.refreshTokenSubject.next(null);

      return this.jwtService.refreshToken().pipe(
        switchMap((token: any) => {
          this.isRefreshing = false;
          this.refreshTokenSubject.next(token);

          return next.handle(request);
        }))
    } else {
      return this.refreshTokenSubject.pipe(
        filter(token => token !== null),
        take(1),
        switchMap(jwt => {
          return next.handle(request);
        }));
    }
  }
}

这是问题所在-我希望请求以相同的顺序发送,就像它们在拦截器中命中一样-httpRequestMock1,httpRequestMock2,httpRequestMock3。这就是它实际上如何通过Web界面工作的方式。但是由于某种原因,我无法在测试中重现它-它返回错误的顺序httpRequestMock2,httpRequestMock3,httpRequestMock1。显然,测试不正确。请问我做错了什么?

1 个答案:

答案 0 :(得分:1)

httpRequestMock2 httpRequestMock3 httpRequestMock1 顺序的原因如下:

第一个请求(调用方法interceptor.intercept在调用JwtService.refreshToken时进入if条件,并且已配置茉莉花测试以使用( delay )rxJS运算符和其余两次拦截方法调用直接进行而无需调用JwtService.refreshToken,因此不会观察到延迟,因此 httpRequestMock2 httpRequestMock3 早于< em> httpRequestMock1 。