Как лучше всего проверить ответ JSON map () в сервисе jasmine.

В этом коде я могу получить все свои типы сигналов тревоги от ws. Теперь хочу протестировать эту услугу. Для этого я попробовал код, как показано ниже.

 public typegetall(): Observable<Alarm[]> {
        ...
    return this.http.get(Api.getUrl(Api.URLS.typegetall), {
      headers: headers
    })
      .map((response: Response) => {
        let res = response.json();
        if (res.StatusCode === 1) {
          this.auth.logout();
        } else {
          return res.StatusDescription.map(alarm => {
            return new Alarm(alarm);
          });
        }
      });
  }

Я пробовал этот модульный тест:

    describe(`Service`, () => {
         beforeEach(() => {
            TestBed.configureTestingModule({
                declarations: [AlarmsTableComponent],
                imports: [],
                providers: [
                    { provide: AlarmsService]
            }).compileComponents()
                .then(() => {
                    myComponent = TestBed.createComponent(AlarmsTableComponent).componentInstance;
                    myService = TestBed.get(AlarmsService);
                });
        });
               afterEach(inject([HttpTestingController], (backend: HttpTestingController) => {
              backend.verify();
        }));
             it('alarms get all', inject([AlarmsService], (alarmeservice: AlarmsService) => {
            expect(alarmeservice.typegetall());
        }));
});

Не могли бы вы попросить меня попробовать это?

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

it('should return reasonable json ssss', inject([AlarmsService, MockBackend], fakeAsync((service: AlarmsService, mockBackend) => {

    const mockResponse = {
        data: [
            { alarmnumber: 0, alarmdesc: 'All cats are lions' },
            { alarmnumber: 1, alarmdesc: 'Video 1' },
            { alarmnumber: 2, alarmdesc: 'Video 2' },
            { alarmnumber: 3, alarmdesc: 'Video 3' },
        ]
    };

    mockBackend.connections.subscribe(connection => {
        connection.mockRespond(new Response(
            new ResponseOptions({
                body: [
                    { alarmnumber: 0, alarmdesc: 'All cats are lions' },
                    { alarmnumber: 1, alarmdesc: 'Video 1' },
                    { alarmnumber: 2, alarmdesc: 'Video 2' },
                    { alarmnumber: 3, alarmdesc: 'Video 3' },
                ]
            })));
    });

    service.typegetall().subscribe(alarmstype => {
        console.log(alarmstype)
        expect(alarmstype.length).toBe(3);
        expect(alarmstype[0].alarmdesc).toEqual("All cats are lions");
    });

    tick();
})));

Результат: Ошибка: невозможно создать XHR из поддельного асинхронного теста. URL-адрес запроса: http: // xxxxxx / v1 / products

2
user9699663 29 Май 2018 в 10:52

1 ответ

Лучший ответ

Я вижу два случая, которые нужно проверить: когда statusCode === 1 и когда statusCode !== 1.

Для первого теста: Имитируйте свой бэкэнд, чтобы он возвращал ответ как наблюдаемый объект со свойством StatusCode, установленным в 1.

Вы должны создать шпиона жасмина для метода logout из объекта auth.

Затем подпишитесь на метод typegetall() и проверьте в этой подписке, был ли вызван logout.

Для второго теста: Смоделируйте свой бэкэнд, чтобы он возвращал ответ как наблюдаемый объект со свойством StatusCode, установленным в 2, И свойством StatusDescription для массива alarm, еще не создавая экземпляр как Alarm.

Затем подпишитесь на typegetall() с возвращаемыми данными (ваш массив Alarm). В этой подписке вы можете проверить длину и, для каждого элемента, являются ли они экземпляром Alarm.

Ознакомьтесь с официальной документацией по тестированию, чтобы узнать, как создать свой фиктивный ответ.

Во-первых :

it('should call logout when statusCode is equal to 1', () => 
{
     alarmService = TestBed.get(AlarmService);
     authService = TestBed.get(AuthService);
    /* Put your mock response here, an observable of object with StatusCode set to 1 */
    spyOn(authService, 'logout');
    alarmService.typegetall().subscribe(() => {
        expect(authService.logout).toHaveBeenCalledTimes(1);
    });
}

Для второго:

it('should return an array Alarm when statusCode is equal to 2', () => 
{
     alarmService = TestBed.get(AlarmService);
     authService = TestBed.get(AuthService);
    /* Put your mock response here, an observable of object with StatusCode set to 2 and StatusDescription set to an array of 3 alarm object*/
    spyOn(authService, 'logout');
    alarmService.typegetall().subscribe((alarms: Alarm[]) => {            
        expect(authService.logout).not.toHaveBeenCalled;
        expect(alarms.length).toBe(3);
        alarms.forEach(alarm => expect(jasmine.any(alarm instanceof Alarm)).toBeTruthy());
        /*
           Other expectations to check object properties values, such as :
           expect(alarms[0].aProperty).toBe(...);
        */
    });
}

В случае ошибки тестирования добавьте оператор rxjs catchError в свою службу (подробнее здесь):

public typegetall(): Observable<Alarm[]> {
    ...
return this.http.get(Api.getUrl(Api.URLS.typegetall), {
  headers: headers
})
  .map((response: Response) => {
    let res = response.json();
    if (res.StatusCode === 1) {
      this.auth.logout();
    } else {
      return res.StatusDescription.map(alarm => {
        return new Alarm(alarm);
      });
    }
  })
  .catchError(error => of(`An error occured: ${error}`));
}

И протестируем это так:

 it('should get an error', () => 
{
     alarmService = TestBed.get(AlarmService);
    /* Create your mock response error here, an observable created with '_throw' and return a value (ex: 'shit, error !') */
    alarmService.typegetall().subscribe(error => expect(error).toBe('shit, error !'));
}
1
Adrien SAULNIER 29 Май 2018 в 13:09