如何对我的 Observable 的 catch 主体进行单元测试

How to unit test the catch body of my Observable

在我的 Angular 应用程序中,我按以下方式使用 Observables

getItem(id): Observable<Object> {
  return this.myApi.myMethod(...).catch(e => {
    /* CATCH BODY */
    return Observable.throw(e);
  });
}

然后我对其进行了单元测试:

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

但是,我不知道如何对 CATCH BODY 进行单元测试,如何模拟 observable 以抛出错误?

我知道已经有人问过类似的问题,但我的情况略有不同,我无法成功对 catch 部分进行单元测试。

创建另一个 it 块,而不是使用 Observable.of 使用 Observable.throw,它将创建一个 Observable,它不发出任何项目并以错误终止

it('getItem(...) should fail',
  inject([MyService], (service: MyService) => {
    const mockData = 'mock'; // can be anything
    const mockObservable = Observable.throw(mockData); // make it fail

    const spy = spyOn(myApi, 'myMethod').and.returnValue(mockObservable);

    service.getItems().subscribe(
        (data) => { 
            // success
        },
        (error) => { 
            expect(error).toEqual(mockData);
        }
    );

    expect(spy).toHaveBeenCalled();
  })
);

希望对您有所帮助