2011-03-14 50 views
0

如何測試以查看事件處理程序是否綁定到使用JSUnit的節點?使用JSUnit測試綁定事件?

這是我有:

var mynode = document.getElementById("mynode"); 

assertNotNull(mynode); 

MyLibrary.attachEvent(mynode, "click", function(){ return true; }); 

assertEquals(typeof mynode.onclick, typeof function(){ return true; }); 

但mynode.onclick的類型,當然,對象;而函數的類型是...而且是一個函數。

如果我只是嘗試assertEquals(mynode.onclick, function(){ return true; });斷言也失敗。

有什麼建議嗎?

回答

1

請注意,「onclick」屬性不是addEventListener相同的機制。

在您的例子中,mynode.onclick屬性可能等於null,因爲MyLibrary.attachEvent使用addEventListener(標準兼容)/ attachEvent(IE < 9)方法。因此,你測試:

typeof mynode.onclick = typeof null = "object" 

現在你的問題是,當DOM Level 2 Events specification寫他們忘了給一個訪問到當前註冊的節點上的事件列表。所以基本上你不能寫你試圖實現的單元測試

DOM Level 3 Events specification(仍處於草稿模式),通過一個新的屬性在2002年處理元件上的問題:eventListenerList

遺憾的是,似乎目前草案已刪除了該財產,我不認爲你會找到一個實現它的瀏覽器。

我只能找到Firefox 3.6實現getListenerInfoFor()方法,但它似乎只在鉻/ XUL模式下可用,所以它不會幫助。

你既可以

  • 等待EventListenerList對象在所有瀏覽器;-)
  • 信任就是在MyLibrary正確添加事件
  • 與回調函數內的測試代碼,並添加一個假的事件來實現調度元素

我希望上的click事件,這將幫助你

Jerome Wagner

1

我不知道JSUnit,但如何使用toString()

assertEquals(mynode.onclick.toString(), "function(){ return true; }"); 

當然,還有一個字符串相等問題。但有一點努力,你可以擺脫這兩個字符串中的所有空格,並比較沒有製表符,空格,換行符...

我不認爲你可以在JavaScript中比較方法/函數。如果你想比較兩個函數,你實際上是在比較它們的引用。這意味着,一旦你在代碼中的不同地方聲明瞭完全相同的函數,它將被視爲不同的函數(它具有不同的地址)。

看看這個關於平等的更多信息The Strict Equality Operators

編輯:你可以嘗試這種方式編寫測試,但仍有越來越false的可能性:

var myHandler = function() { return true; }; 
MyLibrary.attachEvent(mynode, "click", myHandler); 
assertEquals(mynode.onclick, myHandler); 

由於您使用完全相同的功能,在您使用它的兩種情況下都有相同的參考。然而,你必須小心MyLibrary.attachEvent通過引用myHandler(如是複製它?擴展?只是保存參考?...)

+0

如果在使用addEventListener或attachEvent(IE)設置的事件上調用.toString(),則會出現錯誤。在附加事件之前或之後未定義mynode.onclick。如果你打印出來,你可以看到它是一個空對象。 – KeatsKelleher 2011-03-17 14:55:19

+0

啊,好的,我不知道'MyLibrary.attachEvent'是如何工作的。 – rdamborsky 2011-03-17 15:12:29

+0

MyLibrary.attachEvent()測試它是否應該使用attachEvent()(用於IE)或addEventListener(用於其他所有內容)。然後它執行附件。 – KeatsKelleher 2011-03-17 15:17:27