Я создаю приложение на Angular 7, которое отправляет http-запрос (get) на сервер json, затем сервер json возвращает данные.
Мой сервис:
getMembers():Observable<IMember[]> {
return this.http.get<IMember[]>(url);
}
, на которую я могу подписаться:
service.getMembers().subscribe(data => {
this.members = data;
console.log("Called 'getMembers'");
console.log(this.members);
});
, когда я подписываюсь на сервис и печатаю данные:
Called 'getMembers'
Array(496)
0:
id: "496.000"
name: "John Titor"
group: "D"
url: "https://myprofile/"
memberNum: "fakenum1"
... And goes like this till the end of the returned data ....
495:
id: "1.000"
name: "Carl Sagan"
group: "M"
url: "https://myprofile/"
memberNum: "fakenum495"
Я пытаюсь протестировать сервис с httpClientTestingModule:
import { TestBed, inject, getTestBed } from '@angular/core/testing';
import { HttpClientModule } from '@angular/common/http';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { MemberService } from './member.service';
//An interface for the returned data
import { IMember } from './imember'
describe('MemberService', () => {
let injector: TestBed;
let service: MemberService;
let httpMock: HttpTestingController;
let typeMember: IMember[];
//let members;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientModule],
providers: [MemberService, HttpTestingController]
});
injector = getTestBed();
service = injector.get(MemberService);
httpMock = injector.get(HttpTestingController);
//Getting the data from the service
service.getMembers().subscribe(data => {
var members = data;
});
});
//This test success
it('should be created', inject([MemberService], (service: MemberService) => {
expect(service).toBeTruthy();
}));
//This test returns an error
it('should return an Observable<IMember[]>', (members) => {
let type1 = typeof(members);
let type2 = typeof(typeMember);
expect(typeof(type1)).toEqual(typeof(type2));
});
//This test returns an error too
it('first id should equal to 496.00', (data) => {
expect(data[0].id).toBe("496.00");
});
});
Проблема в том, что когда я пытаюсь запустить этот тест с кармой (ng test), он возвращает:
MemberService should return an Observable<IMember[]>
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
и
MemberService first id should equal to 496.00
TypeError: Cannot read property 'id' of undefined
Как вы можетевидите, Карма не может прочитать идентификатор из данных, возвращаемых из наблюдаемой (что на самом деле работает), я попытался запустить этот тест по-другому (без инициализации службы в beforeEach):
it('first id should equal to 496.00 V2', () => {
service.getMembers().subscribe(data => {
let myMembers = data;
expect(myMembers[0].id).toBe("9999.00");
});
});
Но, несмотря на то, что я фактически поставил невозможный тестовый пример, Карма говорит, что этот тест успешен (и если я делаю тот же случай с «должен вернуть наблюдаемый», он не распознает «ожидаемое предложение»).
Что мне здесь не хватает?Я попытался переместить службу в раздел beforeEach, поскольку подозреваю, что карма плохо распознает ожидаемое предложение, потому что оно находится внутри раздела службы подписки.
Может ли кто-нибудь мне помочь?: (