如何使用 JSUnit 测试事件处理程序是否绑定(bind)到节点?
这是我所拥有的:
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; } );
断言也会失败。
有什么建议吗?
最佳答案
请注意,“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() 方法,但它似乎仅在 chrome/XUL 模式下可用,因此没有帮助。
你可以
- 等待 eventListenerList 在所有浏览器中实现;-)
- 相信 MyLibrary 正确添加了事件
- 在回调函数内添加一个带有测试代码的假事件,并在元素上调度一个点击事件
希望这对你有帮助
杰罗姆·瓦格纳
关于javascript - 使用 JSUnit 测试 Bound 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5294028/