Модульное тестирование углового HttpInterceptor retry - PullRequest
0 голосов
/ 07 января 2019

это первый проект, в котором я пытаюсь заставить модульный тест работать для угловых, поэтому я просто выясняю, как это работает. проект находится под углом 7, и у меня есть HttpInteceptorService, чтобы повторить 2 дополнительные попытки в случае сбоя HTTP-запроса:

@Injectable()
export class HttpInterceptorService implements HttpInterceptor {
    constructor() { }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
        return next.handle(request).pipe(retry(2));
    }
}

мои тесты для этого перехватчика пока:

describe('HttpInterceptorService', () => {
    beforeEach(() => TestBed.configureTestingModule({
        imports: [
            HttpClientTestingModule
        ],
        providers: [
            HttpInterceptorService,
            {
                provide: HTTP_INTERCEPTORS,
                useClass: HttpInterceptorService,
                multi: true
            }
        ]
    }));

    it('should be created', () => {
        const service: HttpInterceptorService = TestBed.get(HttpInterceptorService);
        expect(service).toBeTruthy();
    });

    it('should get http 404', () => {
        const http: HttpClient = TestBed.get(HttpClient);

        http.get('/fake-route').subscribe((response: any) => {
            expect(response).toBeTruthy();
            expect(response.status).toEqual('404');
        });
    });
});

так что я проверяю, получаю ли я 404 успешно, но я не знаю, как проверить, повторяет ли перехватчик еще 2 раза.

Редактировать

На самом деле я был не прав, даже мой 'should get http 404' тест не работает правильно, он всегда дает ложный положительный результат.

Редактировать 2

Полагаю, я все ближе, 404 теперь работает нормально, и я добавил тест для «повторной попытки», но он все еще не работает должным образом. Я думаю, что перехватчик, вероятно, даже не вызывается ...

it('should repeat failed request 2 more times', () => {
    const emsg = 'deliberate 404 error';

    jasmine.clock().install();
    spyOn(httpClient, 'get').and.callThrough();

    expect(httpClient.get).not.toHaveBeenCalled();

    httpClient.get(fakeUrl).subscribe(
    (response) => {
      fail('should have failed with the 404 error');
    },
    (error) => {
      expect(error.status).toEqual(404, 'status');
      expect(error.error).toEqual(emsg, 'message');
    });

    jasmine.clock().tick(3000);

    expect(httpClient.get).toHaveBeenCalledTimes(3);

    jasmine.clock().uninstall();
});

и этот тест не пройден: «Ожидаемый шпион получил 3 раза. Он был вызван 1 раз»

1 Ответ

0 голосов
/ 08 января 2019

ОК, наконец-то понял, мой последний подход (Правка 2) тоже не был правильным. Вот мой последний и рабочий тест для повторения:

it('should handle 404 with retry (2 times)', () => {
    const emsg = 'deliberate 404 error';

    httpClient.get(fakeUrl).subscribe(
    (response) => {
        fail('should have failed with the 404 error');
    },
    (error: HttpErrorResponse) => {
        expect(error.status).toEqual(404, 'status');
        expect(error.error).toEqual(emsg, 'message');
    });

    const retry = 2;
    for (let i = 0, c = retry + 1; i < c; i++) {
        const req = httpTestingController.expectOne(fakeUrl);
        req.flush(emsg, { status: 404, statusText: 'Not Found' });
    }
});

также добавил assert для запуска после каждого теста, чтобы убедиться, что больше нет ожидающих запросов:

afterEach(() => {
    httpTestingController.verify();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...