代码之家  ›  专栏  ›  技术社区  ›  Luis Abreu

Angular7:如何在HTTP拦截器上对重试进行单元测试

  •  0
  • Luis Abreu  · 技术社区  · 6 年前

    我有一个http拦截器,用于添加头(身份验证)和在发生错误时执行日志记录。目前,它使用自定义重试策略,该策略将在生成错误之前尝试调用Web服务3次。以下是intercept方法中使用的代码:

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

    不幸的是,它不起作用。有人能帮我指点方向吗?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   Luis Abreu    6 年前

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

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