【发布时间】:2018-11-20 00:20:43
【问题描述】:
我是 Angular 测试的新手,我试图弄清楚如何编写一个模拟 HttpClient.get() 函数的错误响应的测试。基本上,我的服务在其 pipe() 内部同时具有 map() 和 catchError() ,我想练习这两个流程。到目前为止,这是我所拥有的:
我的.service.ts:
getItems(): Observable<ItemViewModels[]> {
return
this.httpClient.get<any>(this.getItemsUrl)
.pipe(
map(json => {
return json.map(itemJson => this.getVmFromItemJson(itemJson));
}),
catchError(() => {
// Log stuff here...
return of(null);
})
);
}
my.service.spec.ts:
it('should catch error and return null if API returns error', () => {
spyOn(service.httpClient, 'get').and.returnValue(new Observable()); // Mock error here
service.getItems().subscribe($items => expect($items).toBe(null));
});
it('should return valid view model array if API returns a valid json', () => {
const mockResponse = [
new SideNavItemViewModel(1),
new SideNavItemViewModel(2),
new SideNavItemViewModel(3)
];
spyOn(service.httpClient, 'get').and.returnValue(of(JSON.stringify(mockResponse)));
service.getSidenavViewModel().subscribe(x => expect(x).toBe(mockResponse));
});
所以实际的问题是我为 httpClient 在单元测试中返回的可观察对象似乎没有进入 .pipe() 函数,这意味着我的测试不起作用:(
有什么想法吗?
谢谢!
【问题讨论】:
标签: unit-testing jasmine mocking angular6 angular-httpclient