Не удается прочитать свойство 'pipe' из неопределенного при тестировании вызова httpclient - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь выполнить модульное тестирование некоторого моего кода в коде приложения ionic4, вызывает конечную точку и отображает ответ на объект, к которому также добавляется касание, чтобы я мог вернуть this.faults как наблюдаемый из моей службы данных.

fetchFaults(): Observable<Fault[]>
{
return this.http.get<{data: Fault[]}>('https://server/api/faults')
  .pipe(tap((data) => this.faults = data.data) // cache
      , map((data) => data.data)); // return just Fault[] from data.data to the subscriber
}

Который я пытаюсь проверить с помощью

  describe('fetchFaults', () => {
    it('makes expected calls', () => {
      const httpClientStub: HttpClient = TestBed.get(HttpClient);
      spyOn(httpClientStub, 'get');
      service.fetchFaults();
      expect(httpClientStub.get).toHaveBeenCalled();
    });
  });

, но получаю сообщение об ошибке. Не удается прочитать свойство 'pipe' из undefined. Нужно ли мне что-либо возвращать из httpstub?

1 Ответ

0 голосов
/ 01 марта 2019

Вот правильный способ написания модульного теста для вашей службы.

import { TestBed, fakeAsync, tick, getTestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';

import { FaultService, Fault } from './fault.service';

describe('Program Service Tests', () => {
    let injector: TestBed;
    let service: FaultService;
    let httpMock: HttpTestingController;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [HttpClientTestingModule],
            providers: [
                FaultService
            ]
        });

        injector = getTestBed();
        service = injector.get(FaultService);
        httpMock = injector.get(HttpTestingController);
    });

    afterEach(() => {
        httpMock.verify();
    });

    it('should get the faults', fakeAsync(() => {
        const results = {data: []};

        service.fetchFaults().subscribe(_ => expect(results.data).toBe(_));

        const req = httpMock.expectOne((request: HttpRequest<any>): boolean => {
            expect(request.url).toEqual('https://server/api/faults');
            expect(request.method).toBe('GET');
            return true;
        });
        req.flush(results);
        tick();
    }));
});

Причина, по которой вы получаете эту ошибку, заключается в том, что вам нужно сообщить шпиону, чтобы он позвонил оригиналуреализация.Вы можете сделать это с помощью цепочки .and.callThrough().Однако лучше и тщательнее реализовать тестирование - код, который я включил выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...