单元测试覆盖范围RxJS.Observable.Catch Block

时间:2017-07-10 19:14:24

标签: angular unit-testing jasmine rxjs

我试图在类似于以下的代码块上获得单元测试覆盖率,特别是调用方法来处理错误的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失败,但这似乎并没有让我走上正确的道路。

1 个答案:

答案 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();    
});