Angular 4 如何在 Observable 中对订阅进行单元测试

Angular 4 How to Unit Test Subscribe inside Observable

我正在尝试测试用于我的 Angular CLI 项目的服务。我已经测试了其中的所有功能,除了那些有订阅的功能,订阅给我带来了麻烦。请帮忙。我该如何测试这个功能?

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Rx';
import { HttpClient } from '@angular/common/http';
import * as moment from 'moment';

@Injectable()
export class BuildService {

  constructor(private httpClient: HttpClient) { }

  index() {
    let o = new Observable( observer => {
      this.httpClient.get("/api/build").subscribe(builds => {
        this.setInitialResultsValue(builds);
        observer.next(builds);
        observer.complete();
      });
    });
    return o;
  }
}

当前参加的考试:

import { TestBed, inject } from '@angular/core/testing';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { MockBackend } from '@angular/http/testing';
import { XHRBackend, ResponseOptions } from '@angular/http';
import { BuildService } from './build.service';
import * as moment from 'moment';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';

describe('BuildService (MockBackend)', () => {
  let mock, service;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [ BuildService, {
        provide: XHRBackend, useClass: MockBackend
      }],
      imports: [ HttpClientTestingModule ]
    });
  });

  beforeEach(inject([BuildService, XHRBackend], (s, b) => {
    service = s;
    mock = b;
  }));

  it('should subscribe all values correctly', () => {
    let o = service.index();
    let response: any;
    spyOn(service, "index").and.returnValue(Observable.of(response));
    expect(response).toEqual(o);
  });

});

我收到的当前错误消息:

Expected undefined to equal Observable({ _isScalar: false, _subscribe: Function }).

如有任何帮助,我们将不胜感激,谢谢

感谢 Buczkowski 和 JB Nizet 的更新答案

函数:

index() {
    return this.httpClient.get('/api/build').do(builds => this.setInitialResultsValue(builds));
  }

测试:

it('should subscribe all builds correctly', inject([HttpClient], (httpClient: HttpClient) => {
  spyOn(httpClient, "get").and.returnValue(Observable.of(builds));
  service.index().subscribe(response => {
    expect(response).toEqual(builds);
  });
}));

试试这个:

it('description', inject([HttpClient], (httpClient: HttpClient) => {
    spyOn(httpClient.get).and.returnValue(Observable.of([])); // Some array with builds objects?
    component.index().subscribe(builds => {
      expect(builds).toEqual([]); // Your expected builds array previously set in spy
    });
});

我们不会监视您想测试的方法,而是监视 HttpClient get 方法。