2010-12-04 12 views
3

J'ai un problème de fuite lors du test de mon plugin jQuery. Le problème se produit lorsque je veux mettre en valeur une valeur ou une fonction sur un objet littéral.Qunit: Test de fuite

Exemple:

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

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

Ce test échoue car le premier test a ajouté le var 'bar' aux valeurs par défaut. Je l'ai corrigé avec le code suivant mais prendre une copie d'une copie n'a pas l'air très élégant.

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

}) 

Aussi, si j'ai quelques objets dans l'espace de noms jQuery, il pourrait devenir un peu désordonné si je dois prendre plusieurs copies de chaque objet. Donc se demandait si quelqu'un avait une meilleure solution pour «réinitialiser» tous les objets?

Répondre

2

Ceci est inhérent à QUnit. À la fin de chaque test, vous devez nettoyer tous les changements d'état que vous avez effectués. Je ne sais pas d'une façon de le faire automatiquement - vous devez écrire le code pour annuler les effets de tout code de test que vous avez écrit, comme ceci:

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

Pour éviter des problèmes avec la dépendance de l'ordre de test Pour isoler complètement vos tests unitaires, vous devez implémenter manuellement la fonctionnalité de configuration et de démontage du niveau de test en créant une fonction pour chacun d'entre eux et en l'incluant au début et à la fin de chacune de vos méthodes de test:

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

} 

Vous pouvez manuellement la configuration des outils run niveau du module et le test de niveau et les fonctions teardown aussi, le cas échéant.