2013-05-08 40 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