Test dans une fermeture javascript

Est-il possible de tester des fonctions javascript qui existent dans une fermeture, par exemple, compte tenu de ce qui suit:

(function() { var a = function() { //do something } window.b = function() { // do something else } })(); 

Est-il possible de tester la fonction d'essai a sans l'exposer? Sinon, y at-il un bon moyen d'exposer un, mais seulement en mode test?

Votre fonction anonyme pourrait prendre un paramètre qui serait indéfini lorsqu'il n'est pas en mode test, et dire que ce paramètre serait un objet, vous pourriez remplir l'objet avec a 's sans exposer directement.

Juste mon .02 $

La plus grande question ici est pourquoi voulez-vous garder le cache caché? Le fait que vous avez cette fonction que vous souhaitez tester est un indicateur qui a une responsabilité qui doit être testée. Le faire en sorte de l'obtenir en test gagne beaucoup plus de valeur lorsqu'il est pesé contre le risque minimal de l'exposer. Si vous voulez vraiment le cacher, je suggérerais quelque chose de similaire à la réponse de Manux où vous créez un objet qui fait ce qu'il fait, mais ne l'expose pas directement. Ensuite, vous pouvez tester le comportement d'un en testant cet objet.

Après avoir révisé la question depuis 4 ans, j'ai maintenant une meilleure solution.

Générer une version testable de votre code comme étape de construction.

Disent que j'utilise Gulp pour minimiser mon JavaScript, et mon code ressemble à ceci:

 var a = function() {} window.b = function() {} 

Pas l'absence d'une fermeture. Maintenant, j'ai configuré une tâche de gulp et je l'ai vu mon code, ainsi:

 gulp.task('js', function () { return gulp.src([dirs.js.src, '*.js'].join('/')) .pipe(wrap('(function() {\n<%= contents %>\n})();')) .pipe(jshint()) .pipe(jshint.reporter('default')) .pipe(gulp.dest(dirs.js.dest)); }); 

Cela enveloppera mon code dans l'IIFE produisant la sortie suivante:

 (function() { var a = function() {} window.b = function() {} )(); 

Génération de la version testable

Maintenant, j'ajoute une autre tâche Gulp, comme celle-ci

 gulp.task('testJs', function () { return gulp.src([dirs.test.src, '*.js'].join('/')) .pipe(wrap( [ '(function() {', '<%= contents %>', '// Smuggle locals out of closure for testing', 'window.a = a;', '})();' ].join('\n') )) .pipe(concat(package.name + '.testable.js')) .pipe(gulp.dest(dirs.test.dest)); }); 

Cela générera le code dangereux, mais vérifiable dans mon répertoire de test:

 (function() { var a = function() {} window.b = function() {} // Smuggle locals out of closure for testing window.a = a; )(); 

Ajouter une tâche de montre …

 gulp.task('watch', function() { gulp.watch([dirs.js.src, '**', '*.js'].join('/'), ['js', 'testJs']); }); 

…et tu as fini.

Vois ici

Voir ici un exemple:

https://github.com/forwardadvance/ng-tweets