Estoy probando un servicio simple. El servicio utiliza 2 valores de otro servicio.
Básicamente, me gustaría probar esos 2 valores: isLogged = false e isLogged = true .
¿Es posible simplemente cambiar el valor de un servicio inyectado o necesito hacer algo más? (que no sé, así que si pudieras guiarme en el camino, te lo agradecería).
Aquí está mi código para probar:
EDITAR He encontrado una solución a mi problema. Debe inyectar el proveedor en los parámetros de inyección , y puede cambiar sus propiedades como desee después.
import { TestBed, async, inject } from '@angular/core/testing'; import { AuthGuardService } from './authguard.service'; import { Router } from '@angular/router'; import { AuthService } from './auth.service'; describe('AuthguardService', () => { let calledUrl = '/logged/main/last'; let authServiceStub = { isLogged: false, redirectUrl: calledUrl }; class RouterStub { navigate(url: string) { return url; } }; beforeEach(() => { TestBed.configureTestingModule({ providers: [ AuthGuardService, { provide: AuthService, useValue: authServiceStub }, { provide: Router, useClass: RouterStub }, ] }); }); it('should ...', inject([AuthGuardService, Router], (service: AuthGuardService, router: Router) => { let spy = spyOn(router, 'navigate'); service.checkLoginState(calledUrl); expect(spy).toHaveBeenCalledWith(['/login']); })); });Su solución declarada es de una manera. Si todo lo que desea lograr es cambiar los valores en una prueba, una forma aún más concisa es simplemente cambiar los valores en authServiceStub directamente:
// inside tests: authServiceStub.isLogged = false; ... authServiceStub.isLogged = true;^ Simple pero no muy resumido.
O parametrizarlo:
let isLogged: false; let authServiceStub = { isLogged: isLogged, redirectUrl: calledUrl }; ... // inside tests: isLogged = false; ... isLogged = true;^ Conciso pero aún no encapsulado.
O agregue un setter:
let authServiceStub = { isLogged: false, setLogged: function(logged) { this.isLogged = logged; }, redirectUrl: calledUrl }; ... // inside tests: setLogged(false); ... setLogged(true);^ Un poco más encapsulado. Podría combinarse con su enfoque de inyección.
O si isLogged se volviera a implementar como una función, podría usar spyOn:
// inside tests: spyOn(authServiceStub, "isLogged").and.returnValue(false); ... spyOn(authServiceStub, "isLogged").and.returnValue(true);^ Más caja negra y potencialmente más flexible/preparado para el futuro, especialmente si se combina con su solución de inyección (porque podría cambiar el talón o simular drásticamente y aun así obtener el comportamiento que desea). Esto es más trabajo por adelantado, por lo que puede no valer la pena. Pero pensar en AuthService en esta forma de caja negra puede darle una razón para refactorizar isLogged en una función (o no).