Тестирование вложенного / вложенного HttpClient в сервисе Angular не завершено - PullRequest
0 голосов
/ 25 марта 2020

Я хотел бы проверить трубопроводный вызов HttpClient, но кажется, что вызов http не завершается вовремя и ответа нет.

configuration.service.ts

public loadData() {
   return this.configurationService.getAppConfig().pipe(
      switchMap(appConfig => this.http.get<string[]>("url"))
   );
}

configuration.service.spe c .ts

let service: CustomService;
let httpTestingController: HttpTestingController;

beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [
            CustomService,
            { provide: ConfigurationService, useClass: MockedConfigurationService }
        ],
        imports: [HttpClientTestingModule],
    });

    httpTestingController = TestBed.get(HttpTestingController);
    service = TestBed.get(ConfigurationService);
});

it("should make a get request for loadData", () => {
    service.loadData().subscribe(data => {
        // This is not called
        console.log(data);
    });

    const req = httpTestingController.expectOne("url");
    req.flush(["my.data"]);

    expect(req.request.method).toEqual("GET");

    httpTestingController.verify();
});

Все работает нормально, если я просто возвращаю запрос как

return this.http.get<string[]>("url");

Я также пытался использовать созданные / завершенные manullay Observables, но подписка не вызывалась для httpClient:

const appConfig$ = this.configurationService.getAppConfig();

return new Observable(observer => {
    appConfig$.subscribe(appConfig => {
        this.http.get<string[]>("url").subscribe(
            result => {
                observer.next(result);
                observer.complete();
            }
        );
    });
});

Что я делаю не так? Похоже, что тестовый пример заканчивается до того, как httpClient сможет завершить.

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Тем временем я понял это.

Проблема заключалась в том, что множественные асинхронные c вызовы привели к тому, что содержимое http flu sh запускается раньше, чем сам вызов.

Так что я использую fakeAsyn c и есть грипп sh () перед сбросом реальных данных, что позволяет httpClient сначала открыть запрос.

it("should make a get request for loadData", fakeAsync(() => {
    service.loadData().subscribe(data => {
        // This is called
        console.log(data);
    });

    flush();

    const req = httpTestingController.expectOne("url");
    req.flush(["my.data"]);

    expect(req.request.method).toEqual("GET");

    httpTestingController.verify();
}));

Может быть, есть лучшие решения, я открыт для них.

0 голосов
/ 25 марта 2020

Я думаю, что ваш MockedConfigurationService не точен. Можем ли мы это увидеть?

Попробуйте

import { of } from 'rxjs';
....
class MockedConfigurationService {
  getAppConfig() {
    return of('hello world'); // or whatever you would like.
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...