尝试使用 Jasmine 测试在单击的元素上调用事件处理程序。有一个“Pad”对象,其中包含一个被点击的 DOM 元素“PadElement”。事件处理程序是 Pad 对象上的一个方法:
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;
}
茉莉花测试:
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();
});
但是,测试失败。请注意,事件侦听器确实被调用(console.log 通过鼠标单击和模拟单击成功写入),并且如果我直接调用 testPad.clickHandler(),Jasmine 的间谍可以拾取它。但是在实际测试中会发生什么?事件处理程序调用是否在运行时转移到不同的对象?这样做的正确方法是什么?