2011-12-20 49 views
1

我有两个问题:如何最好地单元测试事件抽象?

1.)如何最好地单元测试事件监听器? 2.)我有没有正确理解isHostMethod?

我想单元测试一个事件监听器抽象,但我认为测试它的唯一方法是对窗口'加载'事件。

我有一个代码示例在这里:https://gist.github.com/1502326

另外,我使用的是大卫·马克(@cinsoft)isHostMethod检测相关主机对象的支持,但不知道如果我正确地理解概念或没有?因此,举例来说,我是正确的思维,一个主机对象/方法应该是在下列条件下可用的(虽然我明白,这些“条件”是不可靠的):

  • 如果typeof运算返回“功能”(对于大多数浏览器)
  • 如果typeof运算返回“未知”(用于IE < 9中,其中它的实现中所使用ActiveX对象为本地函数)
  • 如果因为ES3规格已允许的typeof返回“对象”和值不为“空”( null返回'object'这是不正确的行为)

如果这些条件中的任何一个为真,那么(同样不可靠)应该表示指定的主机方法可用。

但即使如此,主机对象/方法的实现方式可能与规范规定的方式不同,因此在创建对象并查看是否触发事件时执行全面“特征检测”会更准确(或一些类似的测试)?

感谢您对这些查询提出的任何建议。

+1

如果没有上下文,代码就不能存在。你称之为抽象是根据环境映射到相同名称的3个不同函数。正如你所知道的那样,这些选择会做不同的事情(执行顺序,这是多个听众),即使你仔细检查它们的存在,他们也会继续这样做。 – galambalazs 2012-03-02 22:36:51

回答

0

最简单的方法是使用合成单击事件。鉴于你要点的代码,你可以使用测试:

var evt; 

events.add(document.body, "click", function() { 
    // swap this for an assert(true, "message"); 
    console.log(true, "supported"); 
}); 

// IE nodes support a click() method 
if (document.body.click) { 
    document.body.click(); 
} else { 
// Standards based events have to be created, initialized and dispatched.  

    evt = document.createEvent("MouseEvents"); 
    evt.initMouseEvent( 
     "click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null 
); 

    document.body.dispatchEvent(evt); 
} 

参见:http://jsfiddle.net/rwaldron/CR4FC/

测试中:IE6,7,8; Chrome 17; Firefox 10; Safari 5.1.2; Opera 11