MODIFICARE:
Il caricamento di un modulo mediante vm
può causare comportamenti imprevisti (ad esempio l' instanceof
operatore non lavora più con oggetti creati in tale modulo perché i prototipi globali sono diversi da quelli utilizzati nel modulo caricato normalmente require
). Non utilizzo più la tecnica seguente e utilizzo invece il modulo di ricablaggio . Funziona meravigliosamente. Ecco la mia risposta originale:
Elaborazione della risposta di srosh ...
Sembra un po 'confuso, ma ho scritto un semplice modulo "test_utils.js" che dovrebbe permetterti di fare quello che vuoi senza avere esportazioni condizionali nei tuoi moduli applicativi:
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;};
Ci sono alcune altre cose che sono incluse module
nell'oggetto gobal di un modulo nodo che potrebbe anche aver bisogno di andare context
nell'oggetto sopra, ma questo è il set minimo di cui ho bisogno per farlo funzionare.
Ecco un esempio usando il moka 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));
});
});