我试图在类似于以下的代码块上获得单元测试覆盖率,特别是调用方法来处理错误的catch块:
return this._http.get(/someurl)
.map((response: Response) => {
let results = <any>response.json();
return results;
})
.catch(response => {
return this.handleError(response);
});
我试过这个:
it('Should call base handleError method when an error occurs',
fakeAsync(inject([MyService, MockBackend],
(myService: MyService, mockBackend: MockBackend) => {
mockBackend.connections.subscribe((connection: MockConnection) => {
expect(connection.request.url).toEqual(
`/someurl`
);
connection.mockRespond(new Response(new ResponseOptions({
status: 404
})));
});
spyOn(myService, 'handleError');
myService.getData(1);
tick();
expect(myService.handleError).toHaveBeenCalled();
})));
永远不会调用catch块,测试失败,因为间谍从未被击中。我尝试过使用MockConnection.mockError也没有运气。我看过需要在Observable上使用subscribe错误处理程序的帖子,但是必须有一种通过错误响应来触发catch块的方法吗?我试过通过Observable.throw()抛出一个Observable失败,但这似乎并没有让我走上正确的道路。
答案 0 :(得分:1)
您必须订阅observable以使其执行异步操作。
spyOn(myService, 'handleError');
myService.getData(1); // subscribe here
tick();
expect(myService.handleError).toHaveBeenCalled();
应该以这种方式实施
spyOn(myService, 'handleError');
myService.getData(1).subscribe(value => {
expect(myService.handleError).toHaveBeenCalled();
});