I am trying to run a unit test of my guard service. I managed to get this far from this answer , but now when I run the unit test for this, it says Expected spy navigate to have been called .
How to make my spy router used as this.router in a service?
Auth-guard.service.ts
import { Injectable } from '@angular/core'; import { Router, CanActivate } from '@angular/router'; @Injectable() export class AuthGuardService { constructor(private router:Router) { } public canActivate() { const authToken = localStorage.getItem('auth-token'); const tokenExp = localStorage.getItem('auth-token-exp'); const hasAuth = (authToken && tokenExp); if(hasAuth && Date.now() < +tokenExp){ return true; } this.router.navigate(['/login']); return false; } }
Auth-guard.service.spec.ts
import { TestBed, async, inject } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { AuthGuardService } from './auth-guard.service'; describe('AuthGuardService', () => { let service:AuthGuardService = null; let router = { navigate: jasmine.createSpy('navigate') }; beforeEach(() => { TestBed.configureTestingModule({ providers: [ AuthGuardService, {provide:RouterTestingModule, useValue:router} ], imports: [RouterTestingModule] }); }); beforeEach(inject([AuthGuardService], (agService:AuthGuardService) => { service = agService; })); it('checks if a user is valid', () => { expect(service.canActivate()).toBeFalsy(); expect(router.navigate).toHaveBeenCalled(); }); });
Replacing RouterTestingModule with a Router , as in the example answer throws Unexpected value 'undefined' imported by the module 'DynamicTestModule' .
coblr source share