2016-12-19 2 views
9

이런 질문을해서 죄송합니다. 하지만 canActivate 가드 파일 테스트를 작성하는 데 블로그 나 YouTube 자습서를 찾을 수 없습니다. 공식 문서에는 언급 된 것이 없습니다.단위 테스트하는 방법 can2ctasate 보호 방법을 사용하여 각도 2 재스민?

도움이 될 것입니다.

+0

정확히 무엇을 테스트 할 것인가? 당신의 가드에서'canActivate()'메소드가 실제로 호출되었거나'canActivate()'메소드 안에있는 코드는 무엇입니까? – AngularChef

답변

14

아무도 내 질문에 답변하지 않았으므로이 상황을 경험할 수있는 사람들을 돕기 위해 내 코드 스 니펫을 붙여 넣습니다.

sampleLoggedIn.guard.ts

import {Injectable} from '@angular/core'; 
import {Router, CanActivate} from '@angular/router'; 
import {StorageService} from '../storage.service'; 

@Injectable() 
export class LoggedInGuard implements CanActivate { 
    constructor(private router: Router, private storageService: StorageService) { 
    } 

    /**Overriding canActivate to guard routes 
    * 
    * This method returns true if the user is not logged in 
    * @returns {boolean} 
    */ 
    canActivate() { 
     if (this.storageService.isLoggedIn) { 
      return true; 
     } else { 
      this.router.navigate(['home']); 
      return false; 
     } 
    } 
} 

sampleLoggedIn.guard.spec.ts

import {TestBed, async} from '@angular/core/testing'; 
import {FormsModule} from '@angular/forms'; 
import {HttpModule} from '@angular/http'; 
import {CommonModule} from '@angular/common'; 
import 'rxjs/Rx'; 
import 'rxjs/add/observable/throw'; 
import {Router} from '@angular/router'; 
import 'rxjs/add/operator/map'; 
import {LoggedInGuard} from './loggedin.guard'; 
import {StorageService} from '../storage.service'; 
import {CookieService} from 'angular2-cookie/core'; 

describe('Logged in guard should',() => { 
    let loggedInGuard: LoggedInGuard; 
    let storageService: StorageService; 
    let router = { 
     navigate: jasmine.createSpy('navigate') 
    }; 

    // async beforeEach 
    beforeEach(async(() => { 
     TestBed.configureTestingModule({ 
      imports: [FormsModule, CommonModule, HttpModule], 
      providers: [LoggedInGuard, StorageService, CookieService, 
       {provide: Router, useValue: router} 
      ] 
     }) 
      .compileComponents(); // compile template and css 
    })); 

    // synchronous beforeEach 
    beforeEach(() => { 
     loggedInGuard = TestBed.get(LoggedInGuard); 
     storageService = TestBed.get(StorageService); 
    }); 

    it('be able to hit route when user is logged in',() => { 
     storageService.isLoggedIn = true; 
     expect(loggedInGuard.canActivate()).toBe(true); 
    }); 

    it('not be able to hit route when user is not logged in',() => { 
     storageService.isLoggedIn = false; 
     expect(loggedInGuard.canActivate()).toBe(false); 
    }); 
}); 
+0

canActivate()에는 인수가 필요합니다. 방법을 알려면 [이 질문] (https://stackoverflow.com/questions/40870670/how-do-i-mock-routerstatesnapshot-for-a-router-guard-jasmine-test)을 참조하십시오. –