Javascript 在使用装置的Jasmine测试中绑定事件处理程序的最佳实践?

Javascript 在使用装置的Jasmine测试中绑定事件处理程序的最佳实践?,javascript,jquery,tdd,jasmine,jasmine-jquery,Javascript,Jquery,Tdd,Jasmine,Jasmine Jquery,尽管这些都与StackOverflow有关,但我还没有找到一个令人满意的答案,所以我在这里发帖,看看Jasmine jQuery用户是否有公认的最佳实践 基本问题很简单,两个相关问题中包含了两个例子: 在我的Javascript中,有一个setup()函数将事件处理程序绑定到页面上的各种选择器,如$('#someDiv')。单击(someHandler);此函数被传递到$(文档)。就绪 在我的Jasmine测试中,我使用表示页面各个提取部分的HTML装置来测试这些元素上的AJAX交互(我正在运

尽管这些都与StackOverflow有关,但我还没有找到一个令人满意的答案,所以我在这里发帖,看看Jasmine jQuery用户是否有公认的最佳实践

基本问题很简单,两个相关问题中包含了两个例子:

  • 在我的Javascript中,有一个
    setup()
    函数将事件处理程序绑定到页面上的各种选择器,如
    $('#someDiv')。单击(someHandler)
    ;此函数被传递到
    $(文档)。就绪

  • 在我的Jasmine测试中,我使用表示页面各个提取部分的HTML装置来测试这些元素上的AJAX交互(我正在运行Jasmine rails“服务器”版本,您可以在浏览器中查看Jasmine测试报告)

当然,问题是,
setup()
尝试绑定处理程序的选择器在加载fixture之后才会存在。因此,Jasmine测试中显式触发的事件将不会被fixture中的DOM元素拾取,因为绑定该处理程序的函数已在
$(document).ready
时间运行

如果Jasmine能够以某种方式延迟调用
$(document).ready
,直到加载装置之后,我就会很高兴了。但显然不能

从上面的两个StackOverflow问题中,我找到了各种解决方法,但都不令人满意:

  • setup
    中的绑定代码复制到HTML装置中。这是非干性的,几乎肯定会导致fixture与现实不同步,加上fixture应该表示不引人注目的JS,因此不会混合代码和标记

  • 在需要设置的测试用例中显式调用
    setup
    函数。这在简单的情况下有效,但如果
    setup
    执行非幂等操作,则会失败

  • setup
    中,使用类似于
    $(document)的内容。在('click','someDiv',someHandler)
    上,而不是上面显示的代码。(我在jQuery1.10.1上)我确实尝试过这个方法,但它不起作用:即使加载的fixture包含一个匹配
    #someDiv
    的元素,在该元素上触发“click”不会导致调用
    someHandler
    。即使它确实工作了,也很混乱,因为(如果我理解正确的话)调用处理程序时
    this
    的值将反映实际处理事件的元素,而不一定是第一次接收事件的元素

  • setup
    中,使用类似
    $('#someDiv').live(someHandler)
    ,但是
    live
    在jQuery 1.7中被弃用,并在1.9中被删除


  • 有没有其他我缺少的方法,不需要仅仅为了适应测试环境而对工作代码进行更改,也不需要违反DRY?

    我有一个使用Jasmine jquery对Jasmine进行DOM操作的示例。您还将在其中的描述中看到一个链接,该链接指向可以克隆的github repo,以便更深入地了解SpecRunner.html如何排序依赖项。基本上,我在jasmine beforeach()中有一个带有onclick事件和jquery click()的html装置。然后让我的测试期望也检查DOM以进行验证。这可能与上面的#2解决方法类似。

    只是一个旁注(不是答案),但尽管JQuery中不推荐使用
    live
    ,但它基本上取代了
    on
    的位置-在过去您可能尝试使用
    live
    ,现在您可以执行类似
    $(文档)的操作。on('click','some selector',函数(){dou_stuff();})
    ,它将绑定文档上的事件,并在您单击时触发。一些选择器元素,不管它在绑定时是否已加载到DOM中。您是否考虑过删除
    jQuery.ready
    ?考虑过它,但它闻起来很难闻,就像核选项或用打桩机杀死蚂蚁。我不知道Jasmine或jQuery是如何依赖它的,所以将其删除似乎不是很安全。