Intentando probar que se llama a un controlador de eventos en un elemento cliqueado con Jasmine. Tenga un objeto "Pad" que contenga un elemento DOM "PadElement", que haga clic. El controlador de eventos es un método en el objeto Pad:¿Jasmine no puede espiar el controlador de eventos?
GRAPH.Pad = function(graphDiv, graph) {
this.graph = graph;
this.clickHandler = function(e) {
console.log('padElement clickHandler called');
//this.graph.createVertex(e.clientX, e.clientY);
};
this.padElement = GRAPH.padElement(graphDiv, this.clickHandler);
}
GRAPH.padElement = function(graphDiv, clickHandler) {
//Initialize pad
var NS="http://www.w3.org/2000/svg";
var pad=document.createElementNS(NS,"svg");
pad.setAttributeNS(null, 'id', 'pad');
graphDiv.appendChild(pad);
pad.addEventListener('click', clickHandler)
return pad;
}
La prueba Jasmine:
var testDiv = document.createElement('div');
var testGraph = new GRAPH.Graph(testDiv);
var testPad = new GRAPH.Pad(testDiv, testGraph);
it('has its clickHandler function called when its padElement is clicked',
function() {
spyOn(testPad, "clickHandler");
simulateClick(testPad.padElement);
//testPad.clickHandler();
expect(testPad.clickHandler).toHaveBeenCalled();
});
Sin embargo, la prueba falla. Tenga en cuenta que se llama al detector de eventos (console.log escribe con éxito con un clic del mouse y con simulateClick), Y si simplemente llamo a testPad.clickHandler() directamente el espía de Jasmine puede recogerlo. ¿Pero qué sucede durante la prueba real? ¿La invocación del manejador de eventos se transfiere a un objeto diferente en el tiempo de ejecución? ¿Cuál es la forma correcta de hacer esto?