【问题标题】:How can I conditionally allow navigation to a user如何有条件地允许导航到用户
【发布时间】:2019-07-26 08:46:25
【问题描述】:

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

我的 AuthRoleGuardService.ts 文件:

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

这是我迄今为止尝试过的:

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

如何传递角色?

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

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

【问题讨论】:

    标签: angular testing service jasmine karma-jasmine


    【解决方案1】:

    要测试守卫,您必须执行以下操作:

    { path : "", component : ComponentName, canActivate : [GuardName]}
    

    编辑

    案例一:

    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:

    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'

    【讨论】:

    • 我知道如何使用它,并且它可以正常工作。我不知道如何测试服务。我如何测试如果角色是 Display 那么它不应该允许导航用户路线。
    • @szkatalin 它会自动完成,我编辑我的帖子以向您展示一个简单的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2018-12-23
    • 2022-12-19
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多