ジャスミンでクリックされた要素でイベントハンドラーが呼び出されることをテストしようとしています。クリックされるDOM要素「PadElement」を含む「Pad」オブジェクトを用意します。イベント ハンドラーは、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はマウスクリックとsimulateClickで正常に書き込みます)、そしてtestPad.clickHandler()を直接呼び出すと、ジャスミンのスパイがそれを拾うことができます. しかし、実際のテストではどうなるでしょうか。イベント ハンドラーの呼び出しは、実行時に別のオブジェクトに転送されますか? これを行う正しい方法は何ですか?