Angular: тестирование охранников, которые возвращают наблюдаемые - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь проверить аутентификацию, которая возвращает наблюдаемое и вызывает другую функцию. Мой охранник выглядит так (снято с девиза Тодда. Приветствия, Тодд):

@Injectable()
export class ProductSummaryLoadedGuard implements CanActivate {
  constructor(private store: Store<fromProductStore.State>) {}

  canActivate(): Observable<boolean> {
    return this.checkStore().pipe(
      switchMap(() => of(true)),
      catchError(() => of(false))
    );
  }

  checkStore(): Observable<boolean> {
    return this.store.pipe(select(fromProductStore.selectProductLoaded)).pipe(
      tap(loaded => {
        if (!loaded) {
          this.store.dispatch(new fromProductStore.LoadProductSummary());
        }
      }),
      filter(loaded => loaded),
      take(1)
    );
  }
}

Я собрал скелет спецификации для этого, и выдержка, вызывающая проблему, такова:

it('should return true when checkStore() returns true', () => {
  spyOn(guard, 'checkStore').and.returnValue(of(true));

  const result = guard.canActivate();
  expect(result).toBeObservable(of(true));
});

Я сталкиваюсь с этой ошибкой в ​​Карме при выполнении этой спецификации:

TypeError: Невозможно прочитать свойство indexOf из неопределенного в Function.TestScheduler.parseMarbles (./node_modules/rxjs/_esm5/internal/testing/TestScheduler.js?:243:21)

Что мне здесь не хватает? Я не хочу идти по пути использования теста на мрамор только для одного этого метода, но если кто-то может предложить способ, я был бы рад попробовать!

...