使用JSUnit测试绑定事件?

时间:2011-03-14 02:05:47

标签: javascript events 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; } );,断言也会失败。

有什么建议吗?

2 个答案:

答案 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.attachEventmyHandler的传递引用的作用(就像复制它一样?扩展?只是保存引用?...)

答案 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模式下使用,所以它无济于事。

你可以

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

我希望这会对你有所帮助

Jerome Wagner