2013-05-08 71 views
5

我有一个简化的QUnit测试它由失败2个简单测试随机/交替没有很好的理由(它们都是原子的,这意味着一个测试不改变其它元件的任何东西)QUnit失败测试不一致/交替

请参阅this jsFiddle尝试运行多次

module("Basic actionBind"); 
//two simple tests 
test("action1", function() { 
    ok(ele2.trigger("click").hasClass("clicked"), "basic click action"); 
}); 

test("action2", function() { 
    ok(ele1.click().hasClass("clicked"), "basic click action"); 
}); 
+0

第二个测试是做什么的?我不确定什么'click'函数没有任何参数。 – 2013-05-08 18:03:01

+0

点击功能本身不带参数的'trigger'是点击 – adardesign 2013-05-08 18:05:03

+0

很奇怪。我已经更新了两次包含这两个测试,并使它们异步暂停,但只有一个测试运行。这就像点击/触发器在第一个之后放弃。 http://jsfiddle.net/bAbNd/1/。 – 2013-05-08 18:36:40

回答

8

的问题是在运行时的全球范围内的jQuery对象的缓存。下面是你的代码 2段(从你的问题的链接:http://jsfiddle.net/adardesign/aZRK7/12/):

HTML:

<div id="qunit-fixture"> 
    <span id="ele1" class="action" data-action="action1"></span> 
    <span id="ele2" class="action" data-action="action2" ></span> 
</div> 

JS:

// caching elements 
var $ele1 = $('#ele1'), 
    $ele2 = $('#ele2'); 

test('action1', function() { 
    ok($ele2.trigger('click') .... 


test('action2', function() { 
    ok($ele1.trigger('click') .... 

的实际元素是#qunit-fixture这里面复位和重新分析每个测试,从而从内部测试引发对现在在document不再元素触发的单击事件。相反,这些元素已被分离,#qunit-fixture已从原始html文本重新分析,从而创建新的DOM元素。

我叉你的jsfiddle并作相应修改它:http://jsfiddle.net/aZRK7/15/

虽然我清理各个地方之前,我注意到了这一点,将发生本质的变化是移动的元素查询到的测试里面:

test('foo', function() { 
    var $foo = $('#ele1'); 
    ok($foo.trigger('click') .... 


test('bar', function() { 
    var $bar = $('#bar'); 
    ok($bar.trigger('click') .... 
+1

+1非常感谢!我希望这应该在花费数小时之前在文档中...再次感谢。 – adardesign 2013-05-09 02:54:12

+1

@adardesign:“QUnit会在每次测试后重置#qunit-fixture元素中的元素,删除所有可能存在的事件。只要你在这个fixture中使用了元素,你不必手动清理你的测试让它们保持原子。“ http://qunitjs.com/cookbook/ – 2013-05-09 03:51:08

+1

这个问题不仅可以缓存全局范围内的元素,还可以**通过其他地方的脚本通过脚本来连接事件**。我有一个按钮,我在脚本中附加了一个'click'处理程序('$(“#equalsButton”)。click(...);')。由于夹具的清理,但是*无需在'default.js' *中重新运行我的事件接线,处理程序交替地或未连接到按钮,因此导致测试失败或相应地成功。解决问题的方法是在每次测试运行之前(或在测试设置例程中)连接'click'事件。 – 2014-02-12 15:44:05

0

编辑:看起来像OP拿出代码的异步部分,任何绊留下答案的情况下,到这一点,但它现在不回答这个问题。

好了,我不知道什么问题,你可能会具有测试本身,但任何AsyncTest的某处必定有一个start();电话。所以从你的提琴:

asyncTest("action1", delay.bind(null, function() { 
    console.log("test1"); 
    ok(ele2.trigger("click").hasClass("clicked"), "basic click action"); 

    start(); 

}, 2000*Math.random())); 

QUnit asyncTest documentation,看到自己的例子。

+0

谢谢你,这不是一个异步操作时,它?除此之外我想你的代码以及和仍然失败http://jsfiddle.net/adardesign/bAbNd/3/ – adardesign 2013-05-08 20:52:57

+0

那么,在你的小提琴使用了'asynTest()',和这样做需要你告诉QUnit时测试的异步部分完成并继续(即调用'start();')。正如我所提到的,我不是100%确定你为什么会失败,而是回答其他部分。我会试着看看我能否找出其他的东西。 – jakerella 2013-05-08 21:00:44