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 

失敗した実行でわかるように、セットアップ コールバックは 2 回正しく実行されますが、いずれかのテストが実行される前です。ティアダウンは必要な DOM 要素を削除するため、2 番目に実行されたテストは、そのセットアップがあまりにも早く呼び出され、最初に実行されたテストがティアダウンで (正しく) 取り除かれたため、必ず失敗します。

この問題は、最初のテストの前に 2 番目のテストが実行されると常に発生しますが、これが問題を引き起こす理由はわかりません。問題が 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 に答える