3

jQuery プラグインをテストするときにリークの問題があります。この問題は、リテラル オブジェクトの値または関数をモック アウトしたいときに発生します。

例:

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

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

最初のテストで「bar」変数がデフォルトに追加されたため、このテストは失敗します。次のコードで修正しましたが、コピーのコピーを取るのはあまりエレガントに見えません。

$(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 名前空間にいくつかのオブジェクトがある場合、各オブジェクトの複数のコピーを取得する必要があると、少し面倒になる可能性があります。それで、すべてのオブジェクトを「リセット」するためのより良い解決策を誰かが持っているのではないかと思っていましたか?

4

2 に答える 2

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 );
});
于 2010-12-20T08:36:49.933 に答える
0

テスト順序の依存関係の問題を回避し、単体テストを完全に分離するには、それぞれの関数を作成し、それを各テスト メソッドの最初と最後に含めることで、テスト レベルのセットアップと分解機能を手動で実装する必要があります。

例: $(document).ready(function () {

    // 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();
    });

}

必要に応じて、モジュール レベルとテスト ラン レベルのセットアップおよび分解機能を手動で実装することもできます。

于 2011-01-13T11:16:40.163 に答える