3

在我的 Angular 应用程序中,我通过以下方式使用 Observables:

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

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, caught: }) })。

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

4

1 回答 1

1

感谢@Pace 的输入:

expect(service.getItem(123)).toEqual(mockObservable)失败,因为它们不是同一个对象。服务方法正在返回一个包装 mockObservable 的新 observable,因此检查失败。您的测试最好订阅从您的服务调用返回的 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(...);
  })
);
于 2017-11-26T19:32:33.427 回答