[英]angular 7: how to unit test retries on an http interceptor
我有一個HTTP攔截器,用於添加標頭(身份驗證)並在發生錯誤時執行日志記錄。 當前,它使用自定義重試策略,該策略將在產生錯誤之前嘗試調用Web服務3次。 這是攔截方法中使用的代碼:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const headers = this.obtemHeaders();
const requestClonado = req.clone({ headers });
return next.handle(requestClonado).pipe(
retryWhen(this.retryStrategy()),
catchError(err => {
console.error(err);
let msgErro: string;
if(err instanceof HttpErrorResponse && this._servicoAutenticacao.trataErroFimSessao(err)) {
msgErro = "A sua sessão terminou. Vai ser redirecionado para a página de login" ;
}
else if(err.status === 503 ) {
msgErro = "O servidor não devolveu uma resposta válida (503).";
}
else {
msgErro = err.error && err.error.message ? err.error.message : "Ocorreu um erro no servidor.";
}
if(err.status !== 503) {
this._logger.adicionaInfoExcecao(msgErro).subscribe();
}
return throwError(msgErro);
}
));
}
對單元進行重試嘗試的最佳方法是什么? 我試過寫這樣的東西:
it("deve efetuar retry e chamar logging antes redirecionar", fakeAsync((done) => {
httpClient.get("/error").subscribe( _ => {},
err => {
expect(err).toBeTruthy();
done();
} );
const request = httpMock.expectOne("/error");
request.error(new ErrorEvent(errorMsg));
tick(500);
tick(500);
tick(500);
expect(trataFimSessaoSpy).toHaveBeenCalled();
expect(trataLogging).toHaveBeenCalledWith({msg: errorMsg});
});
不幸的是,它不起作用。 誰能幫助我指出正確的方向?
謝謝
好的,看來午餐已經幫助我解決了這個問題:
it("deve efetuar retry 3xs e chamar logging antes redirecionar com erro 500", fakeAsync(() => {
httpClient.get("/error").subscribe( _ => {},
err => {
expect(err).toBeTruthy();
expect(trataFimSessaoSpy).toHaveBeenCalled();
expect(trataLogging).toHaveBeenCalledWith({msg: errorMsg});
});
let request: TestRequest;
for(let i = 0; i < 3; i++) {
request = httpMock.expectOne("/error");
request.flush( {message: errorMsg}, { status: 500, statusText: "Server error"} );
tick(500);
}
}));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.