我有一条路需要阻止学生进入。我试图为此编写一个单元测试,但它不起作用。
但是,当我试图编写一个导航到/class的测试时,保护程序上的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语句在测试中失败。但是,如果我实际上模拟了一个学生,然后在浏览器中导航到/class,守卫就会像预期的那样工作,但是它不会在测试中激活。我怎样才能在测试中激活它?
发布于 2018-05-25 16:25:40
我刚刚想明白了。我发现了一些类似的问题,说业力在等待一个可以观察到的问题被解决。我意识到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();
})
)
);https://stackoverflow.com/questions/50508945
复制相似问题