0

如何测试以查看事件处理程序是否使用 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; } );断言也会失败。

有什么建议么?

4

2 回答 2

1

请注意,“onclick”属性与 addEventListener 的机制不同。

在您的示例中, mynode.onclick 属性可能等于 null 因为 MyLibrary.attachEvent 正在使用 addEventListener (符合标准)/ attachEvent (IE < 9)方法。因此你测试:

typeof mynode.onclick = typeof null = "object"

现在您的问题是,当编写DOM 级别 2 事件规范时,他们忘记为当前在节点上注册的事件列表提供访问器。所以基本上你不能编写你尝试实现的单元测试

DOM 3 级事件规范(仍处于草稿模式)在 2002 年通过元素的新属性解决了该问题:eventListenerList

不幸的是,目前的草案似乎已经删除了这个属性,我认为你不会找到实现它的浏览器。

我只能找到实现 getListenerInfoFor() 方法的Firefox 3.6,但它似乎仅在 chrome/XUL 模式下可用,因此无济于事。

你也可以

  • 等待在所有浏览器中实现 eventListenerList ;-)
  • 相信 MyLibrary 正确添加了事件
  • 在回调函数中添加一个带有测试代码的假事件,并在元素上调度一个点击事件

我希望这能帮到您

杰罗姆·瓦格纳

于 2011-03-16T22:08:22.817 回答
1

我不知道 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(比如复制它吗?扩展?只是保存引用?...)

于 2011-03-16T21:43:52.840 回答