EDITAR:
Carregar um módulo usando vm
pode causar comportamento inesperado (por exemplo, o instanceof
operador não trabalha mais com objetos criados nesse módulo porque os protótipos globais são diferentes daqueles usados no módulo carregado normalmente com ele require
). Não uso mais a técnica abaixo e, em vez disso, uso o módulo de religação . Funciona maravilhosamente. Aqui está a minha resposta original:
Elaborando a resposta do srosh ...
Parece um pouco hacky, mas escrevi um módulo "test_utils.js" simples que deve permitir que você faça o que deseja sem ter exportações condicionais em seus módulos de aplicativo:
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;};
Há mais algumas coisas incluídas no module
objeto global de um módulo de nó que também podem precisar ir ao context
objeto acima, mas esse é o conjunto mínimo necessário para que ele funcione.
Aqui está um exemplo usando o 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));
});
});