Угловой 7: как выполнить повторные тесты на http-перехватчике - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть перехватчик HTTP, который используется для добавления заголовков (аутентификации) и для ведения журнала при возникновении ошибки. В настоящее время он использует собственную стратегию повторных попыток, которая будет пытаться вызвать веб-сервис 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});
});

К сожалению, это не работает. Кто-нибудь может помочь и указать мне правильное направление?

спасибо

1 Ответ

0 голосов
/ 05 ноября 2018

Хорошо, похоже, обед помог мне решить эту проблему:

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