1

在 IE9 中执行 QUnit 测试时,我遇到了一个非常奇怪的问题。测试结构是这样的:

function setupTest() {
    // Adding some extra items to the DOM
}

function teardownTest() {
    // Removing dirtied items from the DOM
}

module("MODULE A", {setup: setupTest, teardown: teardownTest});

test("TEST 1", function () {
    // Some simple assertions
});

module("MODULE B", {setup: setupTest, teardown: teardownTest});

test("TEST 2", function () {
    // Some simple assertions
});

这些测试大约有 50% 的时间会失败。我已确保测试完全独立,并且在测试运行之前/之后安装/拆卸完全完成。问题归结为设置回调有一半的时间被乱序调用。通过日志记录,我可以看到这种情况:

成功运行:

LOG: completing setup
LOG: MODULE A: TEST 1
LOG: completing teardown
LOG: completing setup
LOG: MODULE B: TEST 2
LOG: completing teardown 

运行失败:

LOG: completing setup
LOG: completing setup    <-- ?
LOG: MODULE B: TEST 2
LOG: completing teardown
LOG: MODULE A: TEST 1
LOG: completing teardown 

正如您在不成功的运行中看到的那样,设置回调正确执行了两次,但在执行任何一个测试之前。由于 teardown 删除了所需的 DOM 元素,因此第二个执行的测试必然会失败,因为它的设置被调用得太早,并且第一个执行测试(正确地)通过它的 teardown 将其撕掉了。

当第二个测试在第一个测试之前执行时,总是会出现这个问题,但我看不出这会导致问题的原因。该问题从未出现在 Chrome 中。

4

1 回答 1

0

我在 Chrome 中遇到了同样的问题(正好 50% 的时间我的测试失败了)并通过下一种方式解决了它:

有错误的代码:

require(["jquery", "jquerymobile", "QUnit", "underscore", 
    "units/general.unit", "units/mapping.unit"],
function( $, jqm, __QUnit, _ ) {
    var test_modules = Array.prototype.splice.call(arguments, 4);
    _.each( test_modules, function(test){
        test.start();
    });
    QUnit.load();
    QUnit.start();
});

修正版

require(["jquery", "jquerymobile", "QUnit", "underscore", 
    "units/general.unit", "units/mapping.unit"],
function( $, jqm, __QUnit, _ ) {
    QUnit.load();
    QUnit.start();
    var test_modules = Array.prototype.splice.call(arguments, 4);
    _.each( test_modules, function(test){
        test.start();
    });
});

QUnit.load()QUnit.start()在测试调用之前移动,它可以解决问题。

于 2014-05-21T10:44:11.910 回答