【发布时间】:2018-05-08 19:30:13
【问题描述】:
在我的 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(...);
})
);
而且效果很好。
但是,如果我尝试使用 catch 将 default error-handling logic 添加到我的 getItem() 方法中:
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 , 捕获: }) }).
这是什么意思?为什么会这样?我该如何解决这个问题?
【问题讨论】:
-
catch是一个运算符,因此它返回一个新的 observable 以及您期望的 observable,因为它是source。这就是运营商的实现方式。 -
扩展@cartant 的评论。检查
expect(service.getItem(123)).toEqual(mockObservable)失败,因为它们不是同一个对象。 service 方法返回一个新的 observable 包装mockObservable,因此检查失败。您的测试最好订阅从您的服务调用返回的 observable 并确保它返回'mock'。 -
感谢@Pace,这实际上解决了我的问题。
标签: typescript jasmine rxjs angular-observable angular-test