EDITAR:
Chargement d'un module à l'aide de vm
peut provoquer un comportement inattendu (par exemple, l'option instanceof
ne fonctionne plus avec les objets qui sont créés dans un tel module car les prototypes globaux sont différents de ceux utilisés dans les modules chargés normalement avec require
). Je n'utilise plus la technique ci-dessous et j'utilise plutôt la fonction rebrancher module. Il fonctionne à merveille. Voici ma réponse originale :
En développant la réponse de Srosh...
Cela semble un peu compliqué, 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 :
var Script = require('vm').Script,
fs = require('fs'),
path = require('path'),
mod = require('module');
exports.expose = function(filePath) {
filePath = path.resolve(__dirname, filePath);
var src = fs.readFileSync(filePath, 'utf8');
var context = {
parent: module.parent, paths: module.paths,
console: console, exports: {}};
context.module = context;
context.require = function (file){
return mod.prototype.require.call(context, file);};
(new Script(src)).runInNewContext(context);
return context;};
Il y a encore d'autres choses qui sont incluses dans le gobal d'un module de nœud module
qui pourrait aussi avoir besoin d'aller dans le context
ci-dessus, mais c'est l'ensemble minimum dont j'ai besoin pour que cela fonctionne.
Voici un exemple utilisant mocha BDD :
var util = require('./test_utils.js'),
assert = require('assert');
var appModule = util.expose('/path/to/module/modName.js');
describe('appModule', function(){
it('should test notExposed', function(){
assert.equal(6, appModule.notExported(3));
});
});