Estoy tratando de hacer una prueba unitaria para verificar si una función se llama un máximo de 9 veces, el siguiente código es una aproximación del código real:
function method1( event ) { method2(event); } function method3( event ) { input.value += event.key; } function method2(event) { if (input.length < 9) method3(event); } Como puede ver, se supone que el method3() se ejecuta solo 9 veces.
Esta es una aproximación también de la prueba de unidad que estoy tratando de hacer:
it("method3 should be called 9 times",() => { spyOn(component.method1).and.callThrough; spyOn(component.method2).and.callThrough; spyOn(component.method3).and.callThrough; for (var i = 0; i < 20; i++) { component.method1(new KeyboardEvent('keydown', {key:'1'})); } expect(component.method1).toHaveBeenCalled(); expect(component.method2).toHaveBeenCalled(); expect(component.method3).toHaveBeenCalled(); expect(component.method3).toHaveBeenCalledTimes(9); // with this the TEST DON'T PASS! }); Después de ejecutar las pruebas, las pruebas fallan en toHaveBeenCalledTimes , porque dice: se esperaba que fueran 9 veces, se llamó 0 veces. No sé si la razón es porque es una función anidada.
Otra cosa que también ocurrió es que si hago: expect(component.method1).toHaveBeenCalledTimes(20) en lugar del (9) con el method3 , esa prueba PASS y se llama 20 veces.
¿Puedes ayudarme a resolver esto?
No está llamando al método callThrough() del espía. spyOn realiza una implementación falsa del método que desea espiar. Por lo tanto, su llamada al method2 y al method3 nunca ocurre desde el method1 .
and.callThrough() se usa para llamar al método real que está espiando.
En su caso, no está llamando al método callThrough() . En cambio, solo se está refiriendo a la función callThrough :
spyOn(component.method1).and.callThrough();//Make the actual call ¿Por qué esta afirmación pasa spyOn(component.method1).toHaveBeenCalledTimes(20) ?
Está llamando al method1 1 20 veces en su ciclo for . Tenga en cuenta que está llamando a la implementación falsa 20 veces y su caso de prueba afirma: Oye, ¿este método se llama 20 veces?
Karma runner dice: Sí, se llama 20 veces (llamada de método falso o real, no le importa).