期望的对象是一种ScalarObservable,但是是Observable

时间:2017-11-24 19:31:19

标签: typescript jasmine rxjs angular-observable angular-test

在我的Angular应用程序中,我以下列方式使用Observable:

getItem(id): Observable<Object> {
  return this.myApi.myMethod(...); // returns an Observable
}

我对它进行了单元测试:

it('getItem(...) should correctly do its job',
  inject([MyService], (service: MyService) => {

    const spy = spyOn(myApi, 'myMethod').and.returnValue(mockObservable);

    const mockObservable = Observable.of('mock');

    expect(service.getItem(123)).toEqual(mockObservable);

    expect(spy).toHaveBeenCalledWith(...);
  })
);

它完美无缺。

但是,如果我尝试使用getItem()catch方法添加default error-handling logic

getItem(id): Observable<Object> {
  return this.myApi.myMethod(...).catch(e => {
    /* display a notification error ... */
    return Observable.throw(e);
  });
}

它仍然可以正常工作,但现在测试失败了,说:

  

期望的对象是一种ScalarObservable,但是Observable({_ isScalar:false,source:ScalarObservable({_isScalar:true,value:'mock',scheduler:null}),operator:CatchOperator({selector:Function ,抓住:})})。

这是什么意思?为什么会这样?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

感谢@ Pace的意见:

  

expect(service.getItem(123)).toEqual(mockObservable)失败是因为   它们不是同一个对象。服务方法是返回一个新的   包含mockObservable的observable,因此检查失败。你的考试   最好订阅从你的回复中返回的观察结果   服务电话并确保它返回'mock'

我找到了解决方案:

it('getItem(...) should correctly do its job',
  inject([MyService], (service: MyService) => {

    const spy = spyOn(myApi, 'myMethod').and.returnValue(mockObservable);

    const mockData = 'mock'; // can be anything
    const mockObservable = Observable.of(mockData);


    service.getItems().subscribe((data) => {
      expect(data).toEqual(mockData);
    });

    expect(spy).toHaveBeenCalledWith(...);
  })
);