我的测试有问题,我不知道如何解决这个问题:
我的服务有两种方法:
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()
);
}));
我应该如何正确测试?
答案 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。