angular - JS, enhetstestning : förvänta sig på en callback
Jag använder Leaflet, och jag skapar en markör på den. När musen är utanför denna markör vill jag ta bort popup-fönstret som jag visar på mouseenter :
marker.on('mouseout', e => this.leafletMap.closePopup());
I mina tester skulle jag vilja veta om den återanrop som tillhandahålls är vad jag förväntar mig.
Jag testar redan om händelsen sker på mouseout med
expect((mockedMarker.on as jasmine.Spy).calls.argsFor(0)[0]).toEqual('mouseover');
Några idéer på hur man gör det?
Jag försökte något liknande detta
expect((mockedMarker.on as jasmine.Spy).calls.argsFor(0)[1]).toEqual(JSON.stringify(component.leafletMap.closePopup));
Men jag vet inte vad jag gör (jag är ny på enhetstestning), och jag kan inte hitta en lösning online eftersom jag egentligen inte vet hur man kallar den här typen av test.
Jag bör uppge att jag arbetar i Typescript.
Svar #1
Det du gör är inte ett enhetstest, men eftersom du vill testa skulle jag ge en lösning. Nedan är ett exempel på ett Jasmine-skript som jag har tagit fram för dig
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()")
})
})
Kör på terminalen
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)
Svar #2
Det verkar som att det du vill testa är att funktionsåteranropet gör vad du vill att det ska göra. För det bör du inte kontrollera funktionssträngen. Det testet skulle vara för bräckligt.
Istället bör du kontrollera att när du anropar callback-funktionen är leafleten stängd. Här är ett enkelt test för det. Det förutsätter att du har korrekt strukturerat markören, leafleten och callback-funktionen:
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();
});
});
