angular - JS, pruebas unitarias: esperar en una devolución de llamada
Estoy usando Leaflet, y estoy creando un marcador en él. Una vez que el ratón salga de este marcador, me gustaría eliminar el pop-up que estoy mostrando en mouseenter :
marker.on('mouseout', e => this.leafletMap.closePopup());
En mis pruebas, me gustaría saber si la devolución de llamada proporcionada es lo que espero.
Ya pruebo si el evento ocurre al salir del ratón con
expect((mockedMarker.on as jasmine.Spy).calls.argsFor(0)[0]).toEqual('mouseover');
¿Alguna idea de cómo hacer eso?
Intenté algo así
expect((mockedMarker.on as jasmine.Spy).calls.argsFor(0)[1]).toEqual(JSON.stringify(component.leafletMap.closePopup));
Pero no sé lo que estoy haciendo (soy nuevo en las pruebas unitarias), y no puedo encontrar una solución en línea porque realmente no sé cómo llamar a este tipo de prueba.
Debería declarar que trabajo en Typescript.
Respuesta #1
Lo que estás haciendo no es una prueba unitaria, pero dado que quieres probar, te daré una solución. A continuación hay un ejemplo de un script de Jasmine que preparé para ti
let marker = function() {
function on(a, b) {
console.log(a, b);
}
this.on = on;
}
describe('this', () => {
it('xya', () => {
y = new marker()
spyOn(y, 'on');
y.on('onmouseout', e => this.leafletMap.closePopup());
const lambda = y.on.calls.argsFor(0)[1]
console.log(lambda.toString())
expect(lambda.toString()).toEqual("e => this.leafletMap.closePopup()")
})
})
Ejecutándose en la terminal
npx jasmine mocking.js
Randomized with seed 33786
Started
e => this.leafletMap.closePopup()
.
1 spec, 0 failures
Finished in 0.006 seconds
Randomized with seed 33786 (jasmine --random=true --seed=33786)
Respuesta #2
Parece que lo que quieres probar es que la función de devolución de llamada haga lo que quieres que haga. Para eso, no deberías estar revisando la cadena de la función. Esa prueba sería demasiado frágil.
En cambio, deberías comprobar que cuando invocas la función de devolución de llamada, el folleto esté cerrado. Aquí hay una prueba sencilla para eso. Se asume que has preparado correctamente el marcador, el folleto y la función de devolución de llamada:
describe('Marker', () => {
it('should invoke closePopup', () => {
let marker = createMarkerWithLeaflet();
spyOn(marker, 'on');
spyOn(marker.leaflet, 'closePopup');
marker.on.calls.argsFor(0)[1]();
expect(marker.leaflet.closePopup).toHaveBeenCalled();
});
});
