如何使用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; } );
,断言也会失败。
有什么建议吗?
答案 0 :(得分: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
的传递引用的作用(就像复制它一样?扩展?只是保存引用?...)
答案 1 :(得分: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
不幸的是,目前的草案似乎删除了这个属性,我认为你不会找到实现它的浏览器。
我只能找到实现getListenerInfoFor()方法的Firefox 3.6,但它似乎只能在chrome / XUL模式下使用,所以它无济于事。
你可以
我希望这会对你有所帮助
Jerome Wagner