Угловое тестирование с помощью Karma и Jasmine, метод, использующий HttpClient.get, возвращает undefined в спецификации сервиса, но возвращает данные в компоненте - PullRequest
0 голосов
/ 17 мая 2019

Угловой сервисный метод, который возвращает данные из базы данных, возвращает неопределенную в спецификации тестирования.

У меня есть метод в myservice.ts, который называется getEvents (), который создает массив, вызывает метод http.get и заполняет массив., чтобы вернуть его с информацией базы данных.Однако, когда я вызываю этот метод в моем файле myservice.spec.ts, он возвращает неопределенное значение.

myservice.service.ts:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { MyComponent } from './mycomponent.component.ts';

@Injectable({
  providedIn: 'root'
})
export class MyService {
    getEvents(): string[] {
        const events = [];
        this.http.get<MyClass[]>('http://localhost:3001/getEvents')
                 .subscribe(subscribedEvents => {
                    for (const event of subscribedEvents ) {
                        events.push(event);
                    }
                 });
        return events;
    }
  constructor(private http: HttpClient) { }
}

myservice.service.spec.ts:

import { async, TestBed } from '@angular/core/testing';
import { HttpClientModule } from '@angular/common/http';
import { MyService } from './myservice.service';

describe('MyService', () => {
    beforeEach(async(() => {
        TestBed.configureTestingModule({
          imports: [ HttpClientModule ],
          providers: [ MyService ]
        })
        .compileComponents();
      }));
  it('getEvents', () => {
    const service: MyService = TestBed.get(MyService);
    expect(service.getEvents()[0]).toEqual('FirstEvent');
  });
});

getEvents () вызывает мой внутренний сервер (проверяется компонентом и почтальоном), получает данные из .subscribe () и помещает их в массив.Заполненный массив возвращается.Это прекрасно работает в моем компоненте, но в спецификации сервиса он возвращает undefined.

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

Ошибка:

Expected undefined to equal 'FirstEvent'.

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Как я упоминал в комментариях, мы не используем реальный бэкэнд для получения ответа во время тестирования, вместо этого мы используем HttpTestingController для его стимулирования. Тест вашего примера сервиса может быть что-то вроде ниже;

 it('should return events', async(inject([MyService, HttpTestingController],
    (service: MyService, httpMock: HttpTestingController) => {
      // Arrange
      let endResponse;
      const feedEvent = { sth : '1234' };
      // Act
      service.getEvents().subscribe(result => {
        // Assert
        endResponse = result;
      });
      const request = httpMock.expectOne((req: HttpRequest<any>) => {
        return req.method === 'GET'
      }, `get event`);
      // Assert
      request.flush({ sth: '1234' });
      expect(endResponse).toEqual(feedEvent);
    })));
0 голосов
/ 17 мая 2019

Что вы хотите проверить здесь?Хотите сделать реальный http-звонок?Или издеваться над ответом?

Также ваш сервис должен возвращать наблюдаемое, потому что здесь метод getEvents вернет events = [];, т. Е. Пустой массив, массив будет заполнен только при подписке на наблюдаемое.

Итак, MyService :: getEventsдолжен вернуть наблюдаемое, и вы подпишете его в своем компоненте.

Затем, чтобы проверить его, вы должны смоделировать / шпионить MyService :: getEvents, чтобы он не выполнял реальный вызов http

...