[英]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模式下使用,所以它無濟於事。
你也可以
我希望這能幫到您
傑羅姆瓦格納
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.