2013-04-26 74 views
1

我有一個奇怪的問題,在這個測試失敗,並沒有明顯的原因,我不知道發生了什麼事。有時我會刷新測試,它會通過。其他時候,沒有改變任何東西,它會失敗。想知道是否有人可以解釋發生了什麼事。QUnit測試 - 敲除observableArray沒有正確評估

下面是一些示例代碼:

var viewModel = function() { 
    return { TestDummy: ko.observable() }; 
}; 

QUnit.test("Test 1", function() { 
    var curModel = new viewModel(); 
    validationTestCore.testMaxLength(curModel.TestDummy, '12345'); 

    QUnit.equal(curModel.TestDummy.errorMessages().length, 1); 
}); 

你可以看到,curModel.TestDummy是可觀察到的。這種可觀察到的被傳遞到validationTestCore.testMaxLength,其中errorMessages observableArray被附加到這樣的:

TestDummy.errorMessages = ko.observableArray(); 
TestDummy.errorMessages.push({ errorMessage: 'hello'}); 

當測試並失敗,QUnit結果表明,該長度被評估爲0

不限想法?

+1

你可以發佈你的視圖模型的其餘部分?我假設你至少有一些基因敲除驗證驗證配置... – 2013-04-26 14:39:27

回答

1

我不知道Knockout.js。

但是,這樣的問題的一般原因是因爲你的測試是非原子的。 以前的測試成功或失敗,正在影響他人。

爲確保測試原子性,QUnit在sessionStorage中存儲了失敗的測試。並且在下一次運行中,它將首先執行失敗的測試,並在剩餘之後執行。該方法提供了不同的測試執行順序。如果你的測試不是原子的,它會失敗。

更多的瞭解jsfiddle

var truth = false; 

test("always fine test", function() { 
    truth = !truth; 
    ok(true, "Passed!"); 
    console.log("always fine test"); 
}); 

test("will toggle error test", function() { 
    truth = !truth; 
    ok(truth, "Passed!"); 
    console.log("will toggle error test"); 
}); 

執行整個試了幾次,賦予了新的成績。

爲了避免這種行爲,並按出現的順序執行測試。 您可以使用QUnit.config.reorder = false,但不建議這樣做。