Как издеваться над ошибкой из Observable без сбоев? - PullRequest
0 голосов
/ 13 июня 2018

У меня есть фиктивный сервис

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

Компонент выглядит следующим образом

@Component({
  selector: 'app-root',
  template: `
    <div *ngFor="let num of numbers$ | async">...</div>
    <div *ngIf="error$ | async as error" class="error">{{error}}</div>
  `
})
export class AppComponent {
  numbers$ = this._dataService.numbers$;
  error$ = this._dataService.numbers$.pipe(
    filter(() => false),
    catchError((error: string) => of(error))
  );
}

Но ошибка влияет на весь процесс тестирования.enter image description here

Как мне избежать такого результата?

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

Реальное решение было простым: у меня было , чтобы перехватить все возможные исключения :)

После этого уродливый взлом не нужен.

0 голосов
/ 13 июня 2018

Я нашел решение , но оно уродливо

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

  }));

Пожалуйста, не бейте меня:)

Решение было вдохновлено Асинхронный тест с fakeAsync ()

Может быть, кто-то может улучшить его ...

...