Estoy tratando de escribir una prueba unitaria para ver si se llama al método de clase base
Aquí está la clase base
export abstract class Animal{ protected eatFood() { console.log("EAT FOOD!") } }Esta es la clase que quiero probar.
export class Monkey extends Animal { onHungry(){ this.eatFood(); } }aquí está la prueba
class MockAnimal { public eatFood() { console.log("EAT MOCKED FOOD!"); } } describe('Monkey', () => { beforeEach(() => { TestBed.configureTestingModule({ declarations:[Monkey], providers: [ { provide: Animal, useClass: MockAnimal } ] } }); it('eat food when hungry', fakeAsync(() => { let fixture = TestBed.createComponent(Monkey); spyOn(fixture, 'eatFood'); fixture.componentInstance.onHungry(); expect(fixture.eatFood).toHaveBeenCalled(); })); } No puedo obtener la prueba unitaria para ejecutar esta clase MockAnimal . ¿Es así como probarlo?
TestBed se usa para probar componentes y, como en un NgModule normal, define declaraciones, importaciones, proveedores, ... Pero lo que quiere probar es una clase simple. En la prueba tienes que inicializarlo manualmente:
describe('Monkey', () => { it('eats if hungry', () => { const monkey = new Monkey(); // spying will only work if 'eatFood' is public const eatFoodSpy = spyOn(monkey, 'eatFood'); monkey.onHungry(); expect(eatFoodSpy).toHaveBeenCalled(); }); });Puedes hacer esto, que se burlará de tu llamada.
it('eat food when hungry', fakeAsync(() => { let fixture = TestBed.createComponent(Monkey); fixture.componentInstance['eatFood'] = jasmine.createSpy('eatFood'); fixture.componentInstance.onHungry(); expect(fixture.eatFood).toHaveBeenCalled(); }));