考虑以下拦截器示例
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。显然,测试不正确。请问我做错了什么?
答案 0 :(得分:1)
httpRequestMock2 , httpRequestMock3 , httpRequestMock1 顺序的原因如下:
第一个请求(调用方法interceptor.intercept
在调用JwtService.refreshToken
时进入if条件,并且已配置茉莉花测试以使用( delay
)rxJS运算符和其余两次拦截方法调用直接进行而无需调用JwtService.refreshToken
,因此不会观察到延迟,因此 httpRequestMock2 和 httpRequestMock3 早于< em> httpRequestMock1 。