Как проверить охранников, опираясь на http-запрос? - PullRequest
0 голосов
/ 21 мая 2018

У меня проблема с моим тестом, и я не знаю, как ее решить:

У меня есть два метода в моем сервисе:

isAuthenticated () {
  const token = localStorage.getItem('token');
  if (token) {
    return this.verifyToken(token).pipe(
      map(data => true),
      catchError (error => of(false))
    );
  }
  return of(false);
}

verifyToken (token: string): Observable<any> {
  const data = {'token': token};
  return this.http.post(url/verify/, data);
}

И метод canActivate у меня на страже:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
  return this.auth.isAuthenticated().pipe(
    map(data => {
      if (data) {
        this.router.navigate(['/url/']);
      }
      return !data;
    })
  );
}

Таким образом, если пользователь аутентифицирован, он не может нажать URL (страница входа).И мой тест выглядит так:

let guard: Guard;
let service: Service;

beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [CommonModule],
    providers: [
      Service,
      Guard,
    ]
  }).compileComponents();
  guard = TestBed.get(Guard);
  service = TestBed.get(Service);
});

it('can't see login page when he is logged in', fakeAsync(() =>{
  spyOn(service, 'isAuthenticated').and.callFake(()=>{return true;});
  guard.canActivate(new ActivatedRouteSnapshot(), mockSnapshot).subscribe(
    x => expect(x).toBeFalsy()
  ); 
}));

Я получил

TypeError: this.auth.isAuthenticated(...).pipe is not a function

как мне правильно его проверить?

1 Ответ

0 голосов
/ 03 июля 2018

Ваша реализация сервиса возвращает Observable.Ваш шпион возвращает логическое значение.

Я бы сказал так:

it('can not see login page when he is logged in', () => {
  spyOn(service, 'isAuthenticated').and.callFake(() => { return of(true); });
  guard.canActivate(new ActivatedRouteSnapshot(), mockSnapshot).subscribe(
    x => expect(x).toBeFalsy()
  ); 
}));

Если вы преобразуете Observable в Promise, вы можете использовать синтаксис Typescript await / async вместо подписки наНаблюдаемое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...