Qunit: тест утечки - PullRequest
       5

Qunit: тест утечки

3 голосов
/ 04 декабря 2010

У меня проблема с утечкой при тестировании моего плагина 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, это может стать немного грязным, если мне придется делать несколько копий каждого объекта.Интересно, есть ли у кого-нибудь лучшее решение для «сброса» всех объектов?

Ответы [ 2 ]

2 голосов
/ 20 декабря 2010

Это специально для 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 голосов
/ 13 января 2011

Чтобы предотвратить проблемы с зависимостью от порядка тестирования и полностью изолировать свои модульные тесты, вам нужно будет вручную реализовать функцию настройки и демонтажа уровня тестирования, создав функцию для каждого из них и включив ее в начале и конце каждого тестаметоды:

например, $ (документ) .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();
    });

}

При необходимости вы можете вручную реализовать функции настройки уровня модуля и тестового прогона, а также демонтажа.

...