如何在没有崩溃的情况下模拟Observable中的错误?

时间:2018-06-13 00:15:28

标签: angular unit-testing error-handling karma-jasmine angular-test

我有一个模拟服务

md

我将在使用服务的组件中测试错误案例

export class DataServiceStub {

  numbers$ = of([1,2,3,4,5,6]).pipe(
    switchMap((data: number[]) => {
      if (this._error) {
        return throwError(this._error);
      }
      return of(data);
    });

  private _error: string;

  setError(msg: string) {
    this._error = msg;
  }

}

该组件看起来像这样

it('should show an error message', async(() => {
    const errorMessage = `Fetch data error`;
    testDataService.setError(errorMessage);
    // spyOnProperty(dataStub, 'numbers$').and.returnValue(throwError(errorMessage));
    fixture.detectChanges();
    const compiled = fixture.debugElement.nativeElement;
    expect(compiled.querySelector('.error').textContent).toContain(errorMessage);
}));

但错误会影响整个测试过程。 enter image description here

我该如何避免这样的结果?

2 个答案:

答案 0 :(得分:0)

我找到了一个解决方案但它很难看

  it('should show an error message', fakeAsync(() => {
    const errorMessage = `Fetch data error`;
    spyOnProperty(dataStub, 'numbers$').and.returnValue(throwError(errorMessage));
    fixture.detectChanges();
    const compiled = fixture.debugElement.nativeElement;
    expect(compiled.querySelector('.error').textContent).toContain(errorMessage);

    // Oh my god! it's a super ugly stuff 
    const _tick = () => {
      try {
        tick();
      } catch (e) {
        _tick();
      }
    };
   _tick();

  }));

请不要打我:)

该解决方案的灵感来自Async test with fakeAsync()

也许有人可以改善它......

答案 1 :(得分:0)

真正的解决方案很简单:我已经捕捉所有可能的异常:)

之后不需要丑陋的黑客。