首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何有条件地允许用户导航?

如何有条件地允许用户导航?
EN

Stack Overflow用户
提问于 2019-07-26 08:46:25
回答 1查看 55关注 0票数 0

所以这是我的问题,我想在我的代码中测试这个canActivate函数。

我的AuthRoleGuardService.ts文件:

代码语言:javascript
运行
复制
export class AuthRoleGuardService implements CanActivate {
  constructor(private authService: AuthService, private router: Router) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    const currentUser = this.authService.currentUserSubject.value;

    if (Roles[currentUser.role] >= route.data.role) {
      return true;
    }

    this.router.navigate(['/access-denied'], { queryParams: { redirect: state.url }, replaceUrl: true });
    return false;
  }
}

到目前为止,我尝试过的是:

代码语言:javascript
运行
复制
  it('should allow navigation if user has minimum role', () => {});

  it('should not allow navigation if user does not have minimum role', () => {
    const role = 'DISPLAY';
    const routerMock = jasmine.createSpyObj('Router', ['navigate']);
    expect(roleGuard.canActivate(undefined, ({ url: 'users' } as any) as RouterStateSnapshot)).toBe(false);
    expect(routerMock.navigate).toHaveBeenCalledWith(['access-denied']);
  });

我怎样才能传递这个角色呢?

也许是个很好的解决方案:

代码语言:javascript
运行
复制
  it('should not allow navigation if user does not have minimum role', fakeAsync(() => {
    user.role = 'DISPLAY';

    const route = new ActivatedRouteSnapshot();

    route.data = { role: Roles.SHIFTLEAD };

    expect(roleGuard.canActivate(route, mockStateSnapshot)).toBe(false);
    expect(mockRouter.navigate).toHaveBeenCalledWith(['/access-denied'], {
      queryParams: { redirect: undefined },
      replaceUrl: true
    });
  }));
EN

回答 1

Stack Overflow用户

发布于 2019-07-26 08:50:48

要测试一个守卫,你必须做这样的事情:

代码语言:javascript
运行
复制
{ path : "", component : ComponentName, canActivate : [GuardName]}

编辑

案例1:

代码语言:javascript
运行
复制
export class AuthRoleGuardService implements CanActivate {
  test : number = 0 ;
  constructor(private authService: AuthService, private router: Router) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

    if (this.test != 0) {
      return true;
    }

    this.router.navigate('/access-denied');
    return false;
  }
}

在这种情况下,用户将停留在他所在的页面中,因为我无法访问目标页面

案例2:

代码语言:javascript
运行
复制
export class AuthRoleGuardService implements CanActivate {
  test : number = 0 ;
  constructor(private authService: AuthService, private router: Router) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

    if (this.test == 0) {
      return true;
    }

    this.router.navigate('/access-denied');
    return false;
  }
}

在这种情况下,用户将转到目标页面,因为test的值等于'0‘

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57216358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档