class MyClassComponent { hasAccess = this.hasAccessToSomething(); constructor(private numberService: NumberService) {} private hasAccessToSomething(): boolean { return this.numberService.getNumber() > 5; } } ¿Debo probar hasAccess es igual a false o true dependiendo del valor de numberService.getNumber() ? Este es un estado de clase inicial en el que llamé a un método privado, un método que se supone que no debe probarse, y asigné su valor a mi miembro de clase pública.
Si la respuesta es sí, ¿cómo hacerlo usando jasmine/jest con TestBed?
let component: MyClassComponent; beforeEach(() => { TestBed.configureTestingModule({ providers: [ MyClassComponent, NumberService ] }); component = TestBed.inject(MyClassComponent); }); Podría simular el método NumberService.getNumber , pero el problema es que después de crear el simulacro, no puedo reiniciar la asignación hasAccess . Podría llamar a this.hasAccessToSomething en, por ejemplo ngOnInit y luego probar el valor de hasAccess llamando nuevamente a ngOnInit , pero no me gustaría complicar la clase para fines de prueba. Con una clase tan fácil, podría deshacerme de TestBed y reinicializar el componente usando new MyClassComponent , pero imaginemos que esta clase es mucho más grande con muchas más dependencias.
¿Cómo lo harías tú?
Puede usar jasmine.Spy para tal fin y convertir hasAccess en una propiedad getter:
export class MyClassComponent { public get hasAccess(): boolean { return this.hasAccessToSomething() } ...Dentro de sus pruebas:
describe('MyClassComponent', () => { beforeEach(async () => { TestBed.configureTestingModule({ providers: [ MyClassComponent, NumberService ] }); ... }) it('should have access if numberService.getNumber() returns more than 5', () => { spyOn(TestBed.inject(NumberService), 'getNumber').and.returnValue(6) expect(component.hasAccess).toBeTrue() }) it('should not have access if numberService.getNumber() returns less than 5', () => { spyOn(TestBed.inject(NumberService), 'getNumber').and.returnValue(4) expect(component.hasAccess).toBeFalse() }) }) si NO desea convertir hasAccess en una propiedad getter , debe definir el alcance de la creación del componente justo antes de burlarse/espiar el servicio mediante el uso de bloques de descripción anidados:
describe('MyComponent...', () => { beforeEach(() => /*build the module*/) describe('when NumberService.getNumber returns more than 5', () => { beforeEach(() => { spyOn(TestBed.inject(NumberService), 'getNumber').and.returnValue(6) component = ... }) it('should have access', () => expect(component.hasAccess).toBeTrue()) }) // Symmetric for less than 5creo que eso es lo que buscas
let component: MyClassComponent; beforeEach(() => { TestBed.configureTestingModule({ providers: [MyClassComponent, NumberService], }); }); describe("with default NumberService result", () => { beforeEach(() => { component = TestBed.inject(MyClassComponent); }); it('should ....',()=>{...}) }); describe("with mocked NumberService result", () => { beforeEach(() => { TestBed.overrideProvider(NumberService, { useValue: { getNumber: () => 999 }, }); component = TestBed.inject(MyClassComponent); }); it('should ....',()=>{...}) });