簡體   English   中英

使用JSUnit測試綁定事件?

[英]Test for Bound event using 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; } ); 斷言也失敗了。

有什么建議么?

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

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

當然,字符串相等存在問題。 但是通過一些努力,你可以擺脫這兩個字符串中的所有空格並進行比較,沒有標簽,空格,換行符......

我不認為你可以比較javascript中的方法/功能。 如果要比較兩個函數,實際上是在比較它們的引用。 這意味着,一旦你在代碼中的不同位置聲明了完全相同的功能,它就會被視為不同的功能(它有不同的地址)。

有關平等嚴格平等運算符的更多信息,請查看此內容

編輯:您可以嘗試以這種方式編寫測試,但仍有可能出現false

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

因為你使用完全相同的功能,在你使用它的兩種情況下都有相同的參考。 但是,你必須小心MyLibrary.attachEvent傳遞對myHandler引用(比如復制它嗎?擴展?只是保存引用?...)

請注意,“onclick”屬性與addEventListener的機制不同。

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

typeof mynode.onclick = typeof null = "object"

現在您的問題是,當編寫DOM Level 2 Events規范時,他們忘記為當前在節點上注冊的事件列表提供訪問者。 所以基本上你不能編寫你試圖實現的單元測試

DOM Level 3 Events規范 (仍處於草案模式)通過元素的新屬性在2002年解決了這個問題: eventListenerList

不幸的是,目前的草案似乎刪除了這個屬性,我認為你不會找到實現它的瀏覽器。

我只能找到實現getListenerInfoFor()方法的Firefox 3.6,但它似乎只能在chrome / XUL模式下使用,所以它無濟於事。

你也可以

  • 等待eventListenerList在所有瀏覽器中實現;-)
  • 相信MyLibrary正確地添加了事件
  • 在回調函數中添加帶有測試代碼的虛假事件,並在元素上調度click事件

我希望這能幫到您

傑羅姆瓦格納

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM