Jquery 触发事件的Qunit asyncTest在单独运行时通过,但在另一个测试之后运行时不会通过

Jquery 触发事件的Qunit asyncTest在单独运行时通过,但在另一个测试之后运行时不会通过,jquery,qunit,Jquery,Qunit,我一直在尝试使用qunit运行一些测试,这些测试需要触发单击,然后根据附加到单独js文件中的单击事件的jQuery函数测试是否设置了值或是否使div可见。在设置此项时,我发现在另一个测试之后运行的任何异步测试都会失败,但在单独运行(或首次运行)时都会通过 下面的代码用于底部链接的JSFIDLE简化测试用例。test()外部的on('click')模拟对单击作出反应然后更改值的函数。通过移除第一个test()块,asyncTest()每次都将通过,并且通过在asyncTest()块内移动('cli

我一直在尝试使用qunit运行一些测试,这些测试需要触发单击,然后根据附加到单独js文件中的单击事件的jQuery函数测试是否设置了值或是否使div可见。在设置此项时,我发现在另一个测试之后运行的任何异步测试都会失败,但在单独运行(或首次运行)时都会通过

下面的代码用于底部链接的JSFIDLE简化测试用例。
test()
外部的
on('click')
模拟对单击作出反应然后更改值的函数。通过移除第一个
test()
块,
asyncTest()
每次都将通过,并且通过在
asyncTest()块内移动
('click')
,测试也将每次沿着第一个
test()
块通过,因此,从
test()
块内部触发外部jQuery事件似乎有问题,在
qunit fixture
div中重置测试代码时可能会混淆

在寻找答案时,我见过一些此类问题的实例(交替通过和失败),但似乎没有任何东西可以解释这个特定问题。谁能解释一下为什么会发生这种情况,如果可能的话,谁能提出一个修复方案,保留此处列出的功能

任何帮助都将不胜感激

HTML

JS小提琴

更新:

重新审视这一点,发现通过将我的
.on('click')
处理程序设置为委托,它在重置测试时工作,我认为这是一个更大的问题,请参阅下面更新的fiddle

jQuery('body').on('click', '#click', function(){

    jQuery('#type').val(2);

});

更新2:

我有一种感觉,我在这里试图做的实际上是在单元测试的领域之外,理想情况下不应该使用qUnit进行测试,而应该使用其他工具进行集成测试。。。或者类似的事情。

发生了什么:

  • setTimeout
    trigger
    调用都是异步的
  • 测试完成后,
    qunit夹具
    未复位
  • 测试
    正在同步进行并阻止异步测试

在我的特定测试用例中,我可以通过让事件处理程序使用委托来让它工作

jQuery('body').on('click', '#click', function(){

    jQuery('#type').val(2);

});
我认为这取决于测试重置时,如果不作为委托完成,事件绑定将丢失,这对于jQuery事件处理程序的工作方式是有意义的


我不完全确定如何将其用于使用现有代码运行的实际测试,我不想将这些代码更改为仅用于测试,但我至少更好地理解了测试失败的原因。

我对这个问题做了大量研究,因为我遇到了同样的问题,并在这里找到了解决方法:


Woogy通过在qunit的fixture之外修复HTML,成功避免了jquery在不授权时删除事件处理程序的行为。考虑到你的情况,我不知道这有多可行,或者你是否还在乎,但这对我来说很好

我不完全确定这件事是否就是这样。我又看了一眼,玩了一下我的测试用例,看看是否有什么我能想出的,并且每次都设法让它通过所有测试,方法是将测试之外的
.on('click')
调用作为委托事件。在这里查看更新的小提琴欢迎来到StackOverflow。谢谢你的回答,但请不要链接,只有答案是不鼓励的。在将来的某个时候,链接可能会断开,然后你的答案将毫无用处。请考虑添加一个快速链接你的文章摘要,并保持链接进一步参考。谢谢你的回应,我会看看那个帖子,看看它是否有帮助。我认为问题更多的是使用qUnit来进行集成测试,而不是单元测试。虽然这是基于我有限的测试知识,所以我可能在说废话。
jQuery('body').on('click', '#click', function(){

    jQuery('#type').val(2);

});
jQuery('body').on('click', '#click', function(){

    jQuery('#type').val(2);

});