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 に表示されることはありません。