eval
ne fonctionne pas vraiment par lui-même (il ne fonctionnera qu'avec les fonctions de premier niveau ou les fonctions var
), vous ne pouvez pas capturer les variables de haut niveau qui sont déclarées avec let ou const dans le contexte actuel avec eval, cependant, en utilisant une vm et en l'exécutant dans le contexte actuel sera vous permettent d'accéder tous les variables de niveau supérieur après son exécution...
eval("let local = 42;")
// local is undefined/undeclared here
const vm = require("vm")
vm.runInThisContext("let local = 42;");
// local is 42 here
...bien que les déclarations ou les affectations dans le module "importé" puissent entrer en conflit avec tout ce qui est déjà déclaré/défini dans le contexte actuel au moment où le vm démarre s'ils partagent le même nom.
Voici une solution médiocre. Cependant, cela ajoutera un peu de code inutile à vos modules/unités importés, et votre suite de tests devra exécuter chaque fichier directement afin d'exécuter ses tests unitaires de cette manière. L'exécution directe de vos modules pour faire autre chose que l'exécution de ses tests unitaires serait hors de question sans encore plus de code.
Dans le module importé, vérifiez si le fichier est le module principal, si oui, exécutez les tests :
const local = {
doMath() {return 2 + 2}
};
const local2 = 42;
if (require.main === module) {
require("./test/tests-for-this-file.js")({local, local2});
}
Puis dans le fichier/module de test qui importe le module cible :
module.exports = function(localsObject) {
// do tests with locals from target module
}
Maintenant, exécutez votre module cible directement avec node MODULEPATH
pour exécuter ses tests.