【问题标题】:angular 7: how to unit test retries on an http interceptor角度 7:如何对 http 拦截器进行单元测试重试
【发布时间】:2018-11-05 12:34:03
【问题描述】:

我有一个 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});
});

不幸的是,它不起作用。任何人都可以帮助并指出正确的方向吗?

谢谢

【问题讨论】:

    标签: angular unit-testing rxjs angular-httpclient retrywhen


    【解决方案1】:

    好的,看来午餐帮我解决了这个问题:

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

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 2018-07-16
      • 2019-12-28
      • 2019-05-15
      相关资源
      最近更新 更多