Tengo un servicio llamado MessageBarFactory , con un método void llamado addAlert() . Tengo una prueba unitaria en la que no quiero que se llame a ese método, así que solo lo espío de la siguiente manera:
spyOn(MessageBarFactory, 'addAlert'); // And do nothingEn la rama del código base que estoy probando, hay dos llamadas consecutivas a este método:
. . . MessageBarFactory.addAlert('Patient ' + $scope.patientIn.name.firstName + ....); MessageBarFactory.addAlert('An error occurred attempting to load the patient details ....); . . .Para asegurarme de que se sigue esa rama, estoy probando para ver si ese método ha sido "llamado" dos veces:
expect(MessageBarFactory.addAlert).toHaveBeenCalledTimes(2); Pero recibo un mensaje que también involucra a otros espías míos en otros métodos del mismo servicio, como clearAlertByName :
Error: <toHaveBeenCalledTimes> : Expected a spy, but got Object({ alerts: [ ], addAlert: spy on addAlert, closeAlert: Function, clearAll: Function, clearAlertByName: spy on clearAlertByName, clearAllExceptForWidget: Function, clearAlertByNameByType: Function }). . . .Ahora, por supuesto, podría estar haciendo algo como:
let counter = 0; spyOn(MessageBarFactory, 'addAlert').and.callFake( function(){ counter++; } ); . . . expect(counter).toEqual(2);Pero esto es un poco antinatural y requiere que también coloque una función falsa, lo que aumenta la sobrecarga de tiempo de ejecución para el espía (no es el punto más importante dentro de un contexto de prueba, pero aún así).
Estoy buscando para ver si estoy pensando en esto mal: ¿ toHaveBeenCalledWithTimes() es incompatible con los métodos espiados? Yo pensaría que esta es exactamente la razón por la que querrías espiar un método. ¿Que me estoy perdiendo aqui? Como referencia, estoy usando Jasmine 3.1.0 y, lamentablemente, esto no es negociable para este proyecto, que tiene un gran enfoque en la compatibilidad con versiones anteriores.