在我的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 ,抓住:})})。
答案 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(...);
})
);