Dans de nombreux cadres, les variables internes de la fonction sont utilisées comme variables privées, par exemplevariables de la fonction intérieure d'accès en Javascript
Raphael = (function(){
var _private = function(a,b) {return a+b;};
var _public = function(a) {return _private(a,a);}
var object = {mult2:_public};
return object;
})();
ici, nous ne pouvons pas accéder à partir de l'espace de noms global de la variable nommée private
, car il est un intérieur variable de la fonction anonyme dans la première ligne.
Parfois, cette fonction contient un grand framework Javascript, de sorte qu'elle ne pollue pas l'espace de noms global.
J'ai besoin de tester un objet Raphael
utilise en interne (dans l'exemple ci-dessus, je souhaite exécuter des tests unitaires sur l'objet private
). Comment puis-je les tester?
edit: J'ai reçu des commentaires sur des tests unitaires censés tester des interfaces publiques. Permettez-moi de spécifier un cas d'utilisation. J'écris une bibliothèque appelée Raphael
. Cette bibliothèque est supposée ajouter un seul nom à l'espace de noms global, et rien de plus. Ceci est une exigence particulière pour Javascript, car Javascript n'a pas d'espaces de noms.
Disons que Raphael
utilise une liste chaînée. Si Javascript avait la notion de paquets, je ferais
require 'linked_list'
Raphael = (function(){/* use linked list */})();
Cependant Javascript ne me permet pas de le faire d'une façon qui ne polluerait pas la portée globale avec l'objet de liste chaînée! Je suis donc lié à inline linked_list
dans le périmètre local Raphaël:
Raphael = (function(){
/* implement linked list */
var linked_list = function(){/*implementation*/};
})();
Et maintenant, je veux tester linked_list
mise en œuvre.
l'idée derrière unittests est de tester uniquement les fonctions/méthodes publiques – Andrey
@Andrey, Javascript n'est pas votre langue de tous les jours! Vous ne pouvez pas importer d'autres modules de façon rationnelle, donc si je dois inclure une petite implémentation de liste liée à Raphael, elle devra être intégrée dans la fonction interne de Raphael, afin qu'elle ne soit pas exposée à l'utilisateur de Raphael. Je ne peux pas simplement le "# inclure" ... –
Voir: http://stackoverflow.com/questions/2230469/javascript-sandbox-unit-testing http://stackoverflow.com/questions/716207/testing-private -functions-in-javascript http://stackoverflow.com/questions/1881078/testing-javascript-functions-inside-anonymous-functions et tous – gnarf