HTTP-тесты Jasmine не получают покрытия на конвейере RXJS - PullRequest
0 голосов
/ 06 февраля 2019

Проблема

Привет всем, я добавляю несколько юнит-тестов Карма-Жасмин в свой проект Angular 2, и я не могу на всю жизнь получить покрытие, чтобы поразить операторов RXJS в моих методах обслуживания.

В тестах используются HttpClientTestingModule и HttpTestingController.

Код

Вот простой пример использования оператора карты.

MyService:

getAssetCount(): Observable<AssetModel[]> {
  return this.http
    .get('/myproject/v1/asset-count')
    .pipe(map(response => response as AssetModel[]));
}

MyService.spec:

service = testBed.get(MyService);
httpMock = testBed.get(HttpTestingController);
...

it('should getAssetCount', () => {
  const dummyResponse = [{...}];
  service.getAssetCount().subscribe((response: AssetModel[]) => {
    expect(response).toEqual(dummyResponse);
    const req = httpMock.expectOne(
      '/myproject/v1/asset-count'
    );
    expect(req.request.method).toBe('GET');
    req.flush(dummyResponse);
    httpMock.verify();
  });
});

Результат

Полученное покрытие:

The resulting coverage

Я бы подумал, чтоподписка на наблюдаемое в тесте вызовет вызов map () , но, возможно, я неправильно понимаю, как работают эти фиктивные сервисы.

При взгляде вокруг кажется, что переключение на XHRBackend вместо HttpClientTestingModule для генерации фиктивных ответов 200/404 / etc может решить эту проблему, но помимо того, что они являются более шаблонными, большинство людей предлагают использовать инсталляцию TestingModuleобъявление.

1 Ответ

0 голосов
/ 06 февраля 2019

Попробуйте переместить flush() и другую логику тестирования за пределы подписки, просто оставив ожидаемое (ответ) внутри.Как то так:

it('should getAssetCount', () => {
  const dummyResponse = [{...}];
  service.getAssetCount().subscribe((response: AssetModel[]) => {
    expect(response).toEqual(dummyResponse);
  });
  const req = httpMock.expectOne(
    '/myproject/v1/asset-count'
  );
  expect(req.request.method).toBe('GET');
  req.flush(dummyResponse);
  httpMock.verify();
});
...