2016-12-19 5 views
9

Entschuldigen Sie, dass Sie diese Art von Frage gestellt haben. Ich kann jedoch keine Blog- oder Youtube-Tutorials zum Schreiben von canActivate-Guard-Dateitests finden. Auch in der offiziellen Dokumentation wird nichts erwähnt.Wie Unit-Test canActivate Guard-Methode von Angular2 mit Jasmine?

jede Hilfe wird sehr geschätzt.

+0

Was möchten Sie testen, genau wie? Dass die 'canActivate()' Methode in Ihrem Guard tatsächlich aufgerufen wird oder der Code innerhalb der 'canActivate()' Methode? – AngularChef

Antwort

14

Da niemand meine Frage beantwortet hat, paste ich mein Code-Snippet für die Referenz, um Leuten zu helfen, die diese Situation bekommen könnten.

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() benötigt Argumente. siehe [diese Frage] (https://stackoverflow.com/questions/40870670/how-do-i-mock-routerstatesnapshot-for-a-router-guard-jasmine-test) für die Bereitstellung –