2016-12-19 41 views
9

Przepraszamy za pytanie tego typu. Ale nie jestem w stanie znaleźć żadnego bloga ani samouczków na youtube na temat testowania pliku canActivate. Ani w oficjalnej dokumentacji nie ma nic wspominanego.Jak przeprowadzić test jednostkowy? Czy można zastosować metodę ochronną kątową2 przy użyciu Jasmine?

każda pomoc będzie doceniana.

+0

Co dokładnie chcesz przetestować? Że metoda 'canActivate()' w twojej czujności jest rzeczywiście wywołana lub kod, który znajduje się wewnątrz metody 'canActivate()'? – AngularChef

Odpowiedz

14

ponieważ nikt nie odpowiedział na moje pytanie, dlatego wklejam fragment kodu, aby uzyskać pomoc dla osób, które mogą uzyskać tę sytuację.

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() wymaga argumentów. zobacz [to pytanie] (https://stackoverflow.com/questions/40870670/how-do-i-mock-routerstatesnapshot-for-a-router-guard-jasmine-test), aby dowiedzieć się, jak je zapewnić –