2010-12-04 10 views
3

jQueryプラグインをテストしているときにリークの問題があります。この問題は、リテラルオブジェクトの値または関数を模倣したいときに発生します。Qunit:テスト漏れ

例:

test('Overwrite some default setting', function(){ 
    $.fn.plugin.defaults.bar = 'foo'; 
}); 

test('Bar should be undefined', function(){ 
    equals($.fn.plugin.defaults.bar, undefined); 
}); 

最初のテストはデフォルトに「バー」VARを追加しましたので、このテストは失敗します。私は次のコードで修正しましたが、コピーのコピーを取ってもそれほどエレガントではありません。

$(function(){ 

    /* 
    * Trolley Button Base: Options. 
    */ 

    var defaults_copy = $.extend({}, $.fn.plugin.defaults); 

    var setdown = { 
     setup : function(){ 
      $.fn.plugin.defaults = $.extend({}, defaults_copy); 
     }, 

     teardown : function(){ } 
    }; 

    module('Test leakage', setdown); 

    test('Overwrite some default setting', function(){ 
     $.fn.plugin.defaults.bar = 'foo'; 
    }); 

    test('Bar should be undefined', function(){ 
     equals($.fn.plugin.defaults.bar, undefined); 
    }); 

}) 

また、jQuery名前空間にいくつかのオブジェクトがあると、各オブジェクトを複数コピーする必要がある場合は、少し面倒になることがあります。誰もがすべてのオブジェクトを「リセット」するためのより良い解決策を持っているのだろうかと疑問に思っていましたか?

答えて

2

これは、QUnitの仕様です。各テストの最後に、あなたが行ったすべての状態の変更を取り除く必要があります。私は、自動的にそれを行うための方法を知らない - あなたが書いたすべてのテストコードの効果を元に戻すためのコードを記述する必要があり、このように:

test('Overwrite some default setting', function(){ 
    // test code 
    $.fn.plugin.defaults.bar = 'foo'; 

    // cleanup code 
    delete $.fn.plugin.defaults.bar; 
}); 

test('Bar should be undefined', function(){ 
    equals($.fn.plugin.defaults.bar, undefined); 
}); 
0

テスト順序依存性の問題を防ぐためにユニットテストを完全に分離するには、それぞれのテストメソッドの開始時と終了時に関数を作成してテストレベルのセットアップとティアダウンの機能を手動で実装する必要があります。

$(ドキュメント).ready(関数(){必要な場合は、手動で、あまりにもモジュールレベルとテスト実行レベルのセットアップとティアダウン機能を実装することができ

// Test Setup/TearDown 
    function codeUnderTestModuleTestSetup() { 
     //any setup needed 
    } 

    function resetDefaults() { 
     //code in here to reset defaults 
    } 

    function resetSomethingElse() { 
     //code in here to reset something else 
    } 

    function codeUnderTestModuleTestTearDown() { 
     resetDefaults(); 
     resetSomethingElse(); 
    } 

    //Tests 
    module('Your module title Test Harness');  

    test('FunctionUnderTest_Behaviour_ExpectedResult', 1, function() { 
     codeUnderTestModuleTestSetup(); 

     //Arrange 
     //code removed 

     //Act 
     //Code removed 

     //Assert 
     //Code removed 

     codeUnderTestModuleTestTearDown(); 
    }); 

} 

関連する問題