簡體   English   中英

如何為authguard單元測試canActivate of Angular?

[英]How do I unit test canActivate of Angular for authguard?

如何為auth guard執行單元測試?

我不知道如何開始,有人可以幫助我嗎?

這是我的authguard.component:

import { Injectable } from '@angular/core';
import {
  Router,
  CanActivate,
  ActivatedRouteSnapshot,
  RouterStateSnapshot
} from '@angular/router';

import { LoginService } from '../services/login/login.service';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {
  constructor(private router: Router, private loginService: LoginService) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    const currentUser = this.loginService.currentUserValue;
    if (currentUser) {
      // Authorized so return true
      return !0;
    }

    // not authorized so redirect to signin page with the return url
    this.router.navigate(['/login'], {
      queryParams: { returnUrl: state.url }
    });
    return !1;
  }
}

您需要為路由器和LoginService進行模擬。

測試可能如下所示:

describe('LoginService', () => {
let navigateMock;
let loginService: LoginService;

beforeEach(() => {
    navigateMock = jest.fn();
    const RouterMock: Mock<Router> = jest.fn(() => (<Router> {
         navigate: navigateMock,
    }));
    // ...some more mocks
}

it('should redirect without error', (done: DoneCallback) => {
     // mock the login method, e.g. 
    loginServiceMock.loadDocumentAndLogin = jest.fn(() => Promise.reject({} as OAuthErrorEvent)); // if you use OAuth

     // call loginService.canActivate and expect the behaviour of the navigator    
     loginService.canActivate().subscribe(f => f, () => {
          expect(navigateMock).toBeCalledWith(['loginerror'], {
          queryParams: {
               code: '',
               description: ''
          }
          });
          done();
          });
     });

...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM