具有observables的单元测试模拟服务=>订阅不是函数

时间:2017-01-25 07:12:50

标签: unit-testing angular mocking karma-jasmine observable

我试图为在Typescript / Angular2中编写的模拟服务设置一些单元测试。 当我尝试在单元测试中调用服务中的任何方法时,我得到了

TypeError: this._subscribe is not a function

在正常使用中,该服务正常。

我的虚拟服务看起来像这样:

    import {Observable} from 'rxjs/Rx';
import {Zahlungsverbindung, ZahlungsverbindungArtEnum} from '../../model/zahlungsverbindung.model';
import {Response} from '@angular/http';
import {RestData} from '../RestData';
import {Injectable} from '@angular/core';

@Injectable()
export class DummyDataServiceMock {

  private _someData : RestData = this.createDummyData();


  public getDummyData(): Observable<RestData> {
    return Observable.create(this._someData);
  }

  private createDummyData(): RestData {

    let id = 1;

    let usable = true;
    let someValue = 'AKTUELL';
    let otherValue = 'Dummy Person';

    let restData: RestData = {
      id: id,
      usable: usable,
      someValue: someValue,
      otherValue: otherValue,

    }

    return restData;
  }

}

这是RestData:

export interface RestData {
  id?: number;
  usable?: boolean;
  someValue?: string;
  otherValue?: string;
}

失败的单元测试:

import {DummyDataServiceMock} from '../DummyData.service.mock.ts';
import {RestData} from '../RestData.ts';
import {TestBed, inject, async} from '@angular/core/testing';


describe('DummyService (Mocked)', () => {

  let service;


  beforeEach(() => TestBed.configureTestingModule({
    providers: [DummyDataServiceMock],
  }));

  beforeEach(inject([DummyDataServiceMock], s => {
    service = s;

  }));

  it('Service should be defined', async(() => {

    expect(service).toBeDefined();


  }));

  it('Get dummy data from service', async(() => {

    let restData: RestData;

    service.getDummyData().subscribe(data => {
      restData = data
      expect(restData.id).toBeDefined();
    });


  }));
})

我尝试了很多方法来设置测试,但没有一种方法可以工作。 我也在网上搜索了很多,但我找不到有同样问题的人。 奇怪的是,服务是定义的,当我做的时候

console.log(JSON.stringify(service.getDummyData()));

我明白了:

Observable {_isScalar: false, _subscribe: Object}

我希望你们能再帮助我一次。

1 个答案:

答案 0 :(得分:5)

您应该使用Observable.of代替Observable.create,因为您要创建RestData的流。 of

  

“将参数转换为可观察序列”

create

  

“通过函数”

从头创建一个Observable

详细了解ofcreate