【问题标题】:How can I make a Unit test for this canActivate Guard如何为此 canActivate Guard 进行单元测试
【发布时间】:2023-04-07 03:33:02
【问题描述】:

这是一个重要的问题,我如何为这个 Guard 进行单元测试,这样做的目的是如果我通过了身份验证,然后返回 false 并重定向到登录,如果我们返回登录并且如果我们之前已经过身份验证,然后转到个人资料页面,如果这是我们第一次登录,那么继续前进,为什么?因为我不想去那个路由(回调页面)在这种情况下路由它来自外部服务(okta)的回调这是守卫的代码:

import { Injectable } from '@angular/core';
import { LoginMineService } from '../login/login-mine.service';
import { Router } from '@angular/router';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';


@Injectable({
  providedIn: 'root'
})
export class LoginCheckGuard implements CanActivate {

  constructor(private loginMineService: LoginMineService,
              private router: Router,
  ) {

  }
  canActivate(): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    if (!this.loginMineService.isAuthenticated) {
      return true;

    } else {
      this.router.navigate(['/login']);
      return false;

    }

  }
}

这是单元测试代码:

import { TestBed } from '@angular/core/testing';

import { LoginCheckGuard } from './login-check.guard';

describe('LoginCheckGuard', () => {
  let guard: LoginCheckGuard;

  beforeEach(() => {
    TestBed.configureTestingModule({});
    guard = TestBed.inject(LoginCheckGuard);
  });

  it('should be created', () => {
    expect(guard).toBeTruthy();
  });



});

PS:我正在开发 Angular 9,谢谢大家

【问题讨论】:

标签: angular unit-testing karma-jasmine


【解决方案1】:

这样的事情应该可以工作:

import { TestBed } from '@angular/core/testing';

import { LoginCheckGuard } from './login-check.guard';
.......

describe('LoginCheckGuard', () => {
  let guard: LoginCheckGuard;
  let mockLoginMineService = { isAuthenticated: undefined };
  let loginMineservice: LoginMineService;
  let router: Router;

  beforeEach(() => {    
    TestBed.configureTestingModule({ 
      // RouterTestingModule to get a handle on the router in a testing environment
      imports: [RouterTestingModule],
      providers: [
                  LoginCheckGuard,
        { provide: LoginMineService, useValue: mockLoginMineService },
      ],
    });
    // get handle on items that are needed
    guard = TestBed.inject(LoginCheckGuard);
    loginMineService = TestBed.inject(LoginMineService);
    router = TestBed.inject(router);
    // spy on the router navigate
    spyOn(router, 'navigate');
  });

  it('should be created', () => {
    expect(guard).toBeTruthy();
  });

  it('should return true if the user isAuthenticated', () => {
    loginMineService.isAuthenticated = true;
    expect(guard.canActivate()).toBe(true);
  });

  it('should return false if the user is not authenticated and navigate to login', () => {
     loginMineService.isAuthenticated = false;
     expect(guard.canActivate()).toBe(true);
     expect(router.navigate).toHaveBeenCalledWith(['/login']);
  });
});

请记住,我是在没有代码编辑器的情况下执行此操作的,因此可能会有一些拼写错误。

【讨论】:

  • 非常感谢,但不幸的是这不起作用,但我感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多