如何测试依赖http请求的守卫?

时间:2018-05-21 16:41:18

标签: angular jasmine angular6

我的测试有问题,我不知道如何解决这个问题:

我的服务有两种方法:

loop(N) :-
    between(1, N, X),
    writeln(X),
    X >= N, !.
    loop(X).

并且可以在我的警卫中激活方法:

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

因此,如果用户通过身份验证,则无法访问url(登录页面)。我的测试看起来:

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

我得到了

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

我应该如何正确测试?

1 个答案:

答案 0 :(得分:0)

您的服务实现返回一个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语法,而不是订阅Observable。