How to unit-test canActivate guard method of angular2 using Jasmine?

前端 未结 2 1700
忘了有多久
忘了有多久 2020-12-29 04:51

Sorry for asking this type of question. But I\'m not able to find any blog or youtube tutorials on writing the canActivate guard file testing. Nor in the official documentat

2条回答
  •  [愿得一人]
    2020-12-29 05:50

    since no one answered my question, so I'm pasting my code snippet for the reference to help people who might get this situation.

    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);
        });
    });
    

提交回复
热议问题