Angular 如何访问可观察的';s来自测试角度7的数据

Angular 如何访问可观察的';s来自测试角度7的数据,angular,testing,httprequest,karma-runner,Angular,Testing,Httprequest,Karma Runner,我正在Angular 7中制作一个应用程序,它向json服务器发出http请求(get),然后json服务器返回数据 我的服务是: getMembers():Observable<IMember[]> { return this.http.get<IMember[]>(url); } 当我订阅服务并打印数据时: Called 'getMembers' Array(496) 0: id: "496.000" name: "John Titor" group: "D

我正在Angular 7中制作一个应用程序,它向json服务器发出http请求(get),然后json服务器返回数据

我的服务是:

getMembers():Observable<IMember[]> {
    return this.http.get<IMember[]>(url);
}
当我订阅服务并打印数据时:

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");
  });

});
如您所见,Karma无法从observable返回的数据中读取id(这实际上是可行的),我尝试以不同的方式运行此测试(没有在beforeach中初始化服务):

但是,尽管我实际上设置了一个不可能的测试用例,Karma说这个测试是成功的(如果我对“应该返回一个可观察的”进行同样的测试,它就不会识别“期望语句”)

我错过了什么?我试图将服务移动到beforeach部分,因为我怀疑karma没有很好地识别expect语句,因为它在subscribe服务部分中


有人能帮我吗?:(

1.导入
HttpClientTestingModule
2.在HttpTestingController上使用
expectOne()
flush()
执行模拟请求。3.将订阅从beforeach移到需要它的单独测试中您的“不可能”如果从未触发订阅回调,则测试用例将通过。您可以使用
expectOne()
flush()
模拟发送的响应。这将触发订阅回调。
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");
  });

});
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
it('first id should equal to 496.00 V2', () => {
    service.getMembers().subscribe(data => {
        let myMembers = data;
        expect(myMembers[0].id).toBe("9999.00");
    });
});