EDITAR:
Cargar un módulo usando vm
puede causar un comportamiento inesperado (por ejemplo, el instanceof
operador ya no trabaja con objetos que se crean en dicho módulo porque los prototipos globales son diferentes de los utilizados en el módulo cargado normalmente require
). Ya no uso la técnica a continuación y en su lugar uso el módulo de recableado . Funciona maravillosamente Aquí está mi respuesta original:
Desarrollando la respuesta de Srosh ...
Se siente un poco hacky, pero escribí un simple módulo "test_utils.js" que debería permitirle hacer lo que quiera sin tener exportaciones condicionales en sus módulos de aplicación:
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;};
Hay algunas cosas más que se incluyen en el module
objeto global de un módulo de nodo que también podrían necesitar entrar en el context
objeto anterior, pero este es el conjunto mínimo que necesito para que funcione.
Aquí hay un ejemplo usando 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));
});
});