Жасмин: Наблюдается ошибка службы http в модульном тесте - PullRequest
0 голосов
/ 03 июля 2018

Я не совсем понимаю, как издеваться над тем, что мой http-сервис ловит заметную ошибку. Я прочитал угловую документацию, но я не понимаю, как бы я структурировал тест. Я хотел бы посмеяться над ошибкой в ​​моем сервисе, а затем убедиться, что он фиксирует наблюдаемую ошибку У меня есть другой сервис, который создает и выбрасывает наблюдаемую ошибку. Остальные мои сервисы просто ловят его при возникновении ошибки. Я, честно говоря, очень смущен тем, как это реализовать. Вот простая версия моего сервиса, а также сервис ошибок:

getData(url: string): Observable<any> {
    return this.http.get(url)
       .map(this.extractData)
        .catch(this.handleErrorObservable);
}

  handleErrorObservable(error: Response | any) {
    console.error(error.message || error);
    return Observable.throw(error.message || error);
}

Теперь, как бы я смоделировал ошибку? Нужно ли шпионить за сервисом и заставить его выйти из строя? Будет ли что-то вроде spyOn(service, 'getData).and.returnValue(Observable.throw({status: 404}))) или я смотрю на это неправильно? Спасибо.

РЕДАКТИРОВАТЬ: Код с решением Кастро Роя.

import {HttpErrorResponse, } from '@angular/common/http';
import { TestBed, inject } from '@angular/core/testing'
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'
import {HttpService} from '../services/http.service'

fdescribe('MyService', () => {
    let httpTestingController: HttpTestingController;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [HttpClientTestingModule],
            providers: [HttpService]
        });
        httpTestingController = TestBed.get(HttpTestingController);
    });

    afterEach(() => {

        httpTestingController.verify();
    });

    it('should be created', inject([HttpService], (service: HttpService)=> {
        expect(service).toBeTruthy();
    }));

    it('should handleErrorObservable', inject([HttpService], (service: HttpService) => {
        const urlString = '/data';
        const emsg = 'deliberate 404 error';

        spyOn(service, 'handleErrorObservable').and.callThrough();

        service.getData(urlString).subscribe(
            data => fail('should have failed with the 404 error'),
            (error: HttpErrorResponse) => {

              expect(service.handleErrorObservable).toHaveBeenCalled(); // check if executed

              expect(error.status).toEqual(404, 'status');
              expect(error.error).toEqual(emsg, 'message');

             });

        const req = httpTestingController.expectOne(urlString);


        req.flush(emsg, { status: 404, statusText: 'Not Found' });
      }));
});

1 Ответ

0 голосов
/ 04 июля 2018

spyOn(service, 'getData').and.returnValue(Observable.throw({status: 404}))) migth будет полезно, если вы пытаетесь смоделировать getData какой-либо другой службой, которая его использует, но handleErrorObservable никогда не будет выполнена. Итак, если вы хотите проверить, что handleErrorObservable был вызван, вам может помочь что-то вроде этого:

import { HttpErrorResponse } from '@angular/common/http';
import { TestBed, inject } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';

import { MyService } from './MyService';

describe('MyService', () => {
  let httpTestingController: HttpTestingController;

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

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

  afterEach(() => {
    // After every test, assert that there are no more pending requests.
    httpTestingController.verify();
  });

  it('should be created', inject([MyService], (service: MyService) => {
    expect(service).toBeTruthy();
  }));

  it('should handleErrorObservable', inject([MyService], (service: MyService) => {
    const urlString = '/data';
    const emsg = 'deliberate 404 error';

    spyOn(service, 'handleErrorObservable').and.callThrough();

    service.getData(urlString).subscribe(
        data => fail('should have failed with the 404 error'),
        (error: HttpErrorResponse) => {

          expect(service.handleErrorObservable).toHaveBeenCalled(); // check if executed

          expect(error.status).toEqual(404, 'status');
          expect(error.error).toEqual(emsg, 'message');
        }
    });

    const req = httpTestingController.expectOne(urlString);

    // Respond with mock error
    req.flush(emsg, { status: 404, statusText: 'Not Found' });
  }));
});

Здесь мы используем HttpClientTestingModule и HttpTestingController, чтобы смоделировать ответ об ошибке с кодом состояния 404. Измените MyService на свое имя службы и немного поиграйте с этим примером, для его адаптации потребуются некоторые изменения. твои нужды. Больше информации в документах

Также, взгляните на другой вопрос , где используется другой способ насмешки над сервисом HttpClient.

Надеюсь, это поможет.

...