2011-03-14 76 views
0

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

有什么建议吗?

回答

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

遗憾的是,似乎目前草案已删除了该财产,我不认为你会找到一个实现它的浏览器。

我只能找到Firefox 3.6实现getListenerInfoFor()方法,但它似乎只在铬/ XUL模式下可用,所以它不会帮助。

你既可以

  • 等待EventListenerList对象在所有浏览器;-)
  • 信任就是在MyLibrary正确添加事件
  • 与回调函数内的测试代码,并添加一个假的事件来实现调度元素

我希望上的click事件,这将帮助你

Jerome Wagner

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(如是复制它?扩展?只是保存参考?...)

+0

如果在使用addEventListener或attachEvent(IE)设置的事件上调用.toString(),则会出现错误。在附加事件之前或之后未定义mynode.onclick。如果你打印出来,你可以看到它是一个空对象。 – KeatsKelleher 2011-03-17 14:55:19

+0

啊,好的,我不知道'MyLibrary.attachEvent'是如何工作的。 – rdamborsky 2011-03-17 15:12:29

+0

MyLibrary.attachEvent()测试它是否应该使用attachEvent()(用于IE)或addEventListener(用于其他所有内容)。然后它执行附件。 – KeatsKelleher 2011-03-17 15:17:27