Угловая трасса для испытания 5 единиц с охраной - PullRequest
0 голосов
/ 24 мая 2018

У меня есть маршрут, который мне нужен, чтобы запретить доступ студентам.Я пытаюсь написать модульный тест для этого, но он не работает.

Мои модульные тесты для самого сторожа работают, однако, когда я пытаюсь написать тест, который переходит к / классу метода canActivateна страже не вызывается.

Вот охранник:

canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
  const user = StoreActions.User.getCurrentUser(store.getState());

  if(!user) {
    this.router.navigate(['/pages/login']);
    return false;
  }

  if(user.username.match(/\d/) !== null) {
    this.router.navigate(['/home']);
    return false;
  }

  return true;
}

И тест:

it(
  'should activate guard when a student tries to access /class',
  fakeAsync(
    inject([StudentGuard], (guard: StudentGuard) => {
      const spy = spyOn(guard, 'canActivate');
      store.dispatch(StoreActions.User.setCurrentUser(TestObjects.User.Student));
      router.navigate(['/class/1']);
      tick();
      expect(spy).toHaveBeenCalled();
      discardPeriodicTasks();
    })
  )
);

Вот конкретный маршрут:

{
  path: '',
  children: {
    path: 'class',
    loadChildren: './components/class/class.module#ClassModule',
    canActivate: [StudentGuard]
  }
}

Оператор expect не пройден в тесте.Тем не менее, если я на самом деле выдаю себя за студента, а затем перехожу в / класс в браузере, защита работает, как и ожидалось, но не активируется в тесте.Как я могу активировать его в тесте?

1 Ответ

0 голосов
/ 25 мая 2018

Я только что понял это.Я нашел несколько похожих вопросов, говорящих о том, что карма ждала, пока наблюдаемое будет разрешено.Я понял, что router.navigate возвращает обещание, и карма должна ждать его решения.Я должен был изменить свой тест на это:

it(
  'should activate guard when a student tries to access /class',
  fakeAsync(
    inject([StudentGuard], (guard: StudentGuard) => {
      const spy = spyOn(guard, 'canActivate');
      store.dispatch(StoreActions.User.setCurrentUser(TestObjects.User.Student));
      router.navigate(['/class/1']).then(() => { // added .then
          expect(spy).toHaveBeenCalled(); // put expect here, AFTER navigate is resolved
      });
      tick();
      discardPeriodicTasks();
    })
  )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...