No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Pruebas a canActivate

12/20
Recursos

Aportes 2

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

Las pruebas a canActivate nos permitira ver como se ingresa a la ruta

Para poder hacer eso es necesario crear un archivo que simule fake Routes y fake states en nuestra carpeta testing

snapshot.ts

import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

export function fakeRouterStateSnapshot(options: Partial<RouterStateSnapshot>) {
  return options as RouterStateSnapshot;
}

export function fakeActivatedStateSnapshot(options: Partial<ActivatedRouteSnapshot>) {
  return options as ActivatedRouteSnapshot;
}

para luego cargar esto en nuestro archivo de pruebas de guardianes

auth.guard.spec.ts

import { fakeActivatedStateSnapshot, fakeRouterStateSnapshot, mockObservable } from './../../testing';
import { generateOneUser } from '../models/user.mock';

it('should return true with session', (doneFn) => {
    const activatedRoute = fakeActivatedStateSnapshot({});
    const routerState = fakeRouterStateSnapshot({});
    const userMock = generateOneUser();

    authService.getUser.and.returnValue(mockObservable(userMock));
    guard.canActivate(activatedRoute, routerState)
    .subscribe(rta => {
      expect (rta).toBeTruthy();
      doneFn();
    });
  });

  it('should return true without session', (doneFn) => {
    const activatedRoute = fakeActivatedStateSnapshot({});
    const routerState = fakeRouterStateSnapshot({});
    authService.getUser.and.returnValue(mockObservable(null));
    guard.canActivate(activatedRoute, routerState)
    .subscribe(rta => {
      expect (rta).toBeFalse();
      expect (router.navigate).toHaveBeenCalledWith(['/home']);
      doneFn();
    });
  });

Para poder hacer testing de propiedades en Jasmine, pueden hacer lo siguiente:

  1. Definir las propiedades deseadas en el espía:

    const authServiceSpyObj = jasmine.createSpyObj<AuthService>(
    	'AuthService',
    	[// Mehods here],
    	{
    		user$: observableData(generateOneUser()),
    		// Other properties with his value
    	}
    );
    
  2. Reemplazar el provider con nuestro espía:

    TestBed.configureTestingModule({
    	providers: [
    		AuthGuard,
    		{
    			provide: AuthService,
    			useValue: authServiceSpyObj,
    		},
    	],
    });
    
  3. Inyectamos nuestro provider:

    authServiceSpy = TestBed.inject(AuthService) as jasmine.SpyObj<AuthService>;
    
  4. Definimos nuestras pruebas:

    it('should return true if user is logged in', waitForAsync(() => {
    	const route = fakeActivatedRouteSnapshot({});
    	const state = fakeRouterStateSnapshot({});
    
    	guard.canActivate(route, state).subscribe({
    		next: (value) => {
    		expect(value).toBeTrue();
    		},
    	});
    }));
    
    it("should return false if user isn't logged in", waitForAsync(() => {
    	const route = fakeActivatedRouteSnapshot({});
    	const state = fakeRouterStateSnapshot({});
    
    	(
    		Object.getOwnPropertyDescriptor(authServiceSpy, 'user$')?.get as any
    	).and?.returnValue(observableData(null));
    
    	guard.canActivate(route, state).subscribe({
    		next: (value) => {
            		expect(value).toBeTrue();
    		},
    	});
    }));
    

Les dejo la documentación de Jasmine por si les interesa profundizar más. Espiando propiedades