J'essaie de comprendre comment tester les fonctions internes (c'est-à-dire non exportées) dans nodejs (de préférence avec moka ou jasmine). Et je n'ai aucune idée!
Disons que j'ai un module comme ça:
function exported(i) {
return notExported(i) + 1;
}
function notExported(i) {
return i*2;
}
exports.exported = exported;
Et le test suivant (moka):
var assert = require('assert'),
test = require('../modules/core/test');
describe('test', function(){
describe('#exported(i)', function(){
it('should return (i*2)+1 for any given i', function(){
assert.equal(3, test.exported(1));
assert.equal(5, test.exported(2));
});
});
});
Existe-t-il un moyen de tester l'unité la notExported
fonction sans l'exporter, car elle n'est pas destinée à être exposée?
node.js
unit-testing
jasmine
mocha
xavier.seignard
la source
la source
Réponses:
Le module rewire est définitivement la réponse.
Voici mon code pour accéder à une fonction non exportée et la tester à l'aide de Mocha.
application.js:
test.js:
la source
Cannot find module '../../package' from 'node.js'
. Avez-vous vu cette?L'astuce consiste à définir la
NODE_ENV
variable d'environnement sur quelque chose commetest
, puis à l'exporter conditionnellement.En supposant que vous n'ayez pas installé globalement mocha, vous pourriez avoir un Makefile à la racine de votre répertoire d'application qui contient les éléments suivants:
Ce fichier make configure le NODE_ENV avant d'exécuter mocha. Vous pouvez ensuite exécuter vos tests de moka avec
make test
en ligne de commande.Maintenant, vous pouvez exporter conditionnellement votre fonction qui n'est généralement pas exportée uniquement lorsque vos tests mocha sont en cours d'exécution:
L'autre réponse suggérait d'utiliser un module vm pour évaluer le fichier, mais cela ne fonctionne pas et génère une erreur indiquant que les exportations ne sont pas définies.
la source
ÉDITER:
Le chargement d'un module à l'aide de
vm
peut provoquer un comportement inattendu (par exemple, l'instanceof
opérateur ne travaille plus avec les objets créés dans un tel module car les prototypes globaux sont différents de ceux utilisés dans le module chargé normalement avecrequire
). Je n'utilise plus la technique ci-dessous et utilise à la place le module rewire . Cela fonctionne à merveille. Voici ma réponse originale:Élaborer sur la réponse de srosh ...
Cela semble un peu hacky, mais j'ai écrit un simple module "test_utils.js" qui devrait vous permettre de faire ce que vous voulez sans avoir d'exportations conditionnelles dans vos modules d'application:
Il y a d'autres choses qui sont incluses dans l'
module
objet global d'un module de nœud qui pourraient également avoir besoin d'aller dans lecontext
objet ci-dessus, mais c'est l'ensemble minimum dont j'ai besoin pour que cela fonctionne.Voici un exemple utilisant le moka BDD:
la source
rewire
?En travaillant avec Jasmine, j'ai essayé d'aller plus loin avec la solution proposée par Anthony Mayfield , basée sur rewire .
J'ai implémenté la fonction suivante ( Attention : pas encore complètement testée, juste partagée comme stratégie possible) :
Avec une fonction comme celle-ci, vous pouvez espionner les deux méthodes d'objets non exportés et les fonctions de niveau supérieur non exportées, comme suit:
Ensuite, vous pouvez définir des attentes comme celles-ci:
la source
vous pouvez créer un nouveau contexte en utilisant le module vm et évaluer le fichier js qu'il contient, un peu comme le fait repl. alors vous avez accès à tout ce qu'il déclare.
la source
J'ai trouvé un moyen assez simple qui vous permet de tester, d'espionner et de se moquer de ces fonctions internes à partir des tests:
Disons que nous avons un module de nœud comme celui-ci:
Si nous voulons maintenant tester et espionner et nous moquer
myInternalFn
sans l'exporter en production, nous devons améliorer le fichier comme ceci:Maintenant, vous pouvez tester, espionner et vous moquer
myInternalFn
partout où vous l'utilisez au furtestable.myInternalFn
et à mesure et en production, il n'est pas exporté .la source
Ce n'est pas une pratique recommandée, mais si vous ne pouvez pas utiliser
rewire
comme suggéré par @Antoine, vous pouvez toujours simplement lire le fichier et l'utilisereval()
.J'ai trouvé cela utile lors des tests unitaires de fichiers JS côté client pour un système hérité.
Les fichiers JS mettraient en place un grand nombre de variables globales sous
window
sans aucune instructionrequire(...)
etmodule.exports
(il n'y avait pas de bundler de module comme Webpack ou Browserify disponible pour supprimer ces instructions de toute façon).Plutôt que de refactoriser toute la base de code, cela nous a permis d'intégrer des tests unitaires dans notre JS côté client.
la source