BEARBEITEN:
Das Laden eines Moduls mit vm
kann zu unerwartetem Verhalten führen (z. B. arbeitet der instanceof
Bediener nicht mehr mit Objekten, die in einem solchen Modul erstellt wurden, da sich die globalen Prototypen von denen unterscheiden, die in Modulen verwendet werden, die normalerweise mit geladen werden require
). Ich verwende die folgende Technik nicht mehr und verwende stattdessen das Umverdrahtungsmodul . Es funktioniert wunderbar. Hier ist meine ursprüngliche Antwort:
Ausarbeitung der Antwort von srosh ...
Es fühlt sich ein bisschen hackig an, aber ich habe ein einfaches "test_utils.js" -Modul geschrieben, mit dem Sie tun können, was Sie wollen, ohne bedingte Exporte in Ihren Anwendungsmodulen zu haben:
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;};
Es gibt einige weitere Dinge, die im globalen module
Objekt eines Knotenmoduls enthalten sind und möglicherweise auch in das context
obige Objekt aufgenommen werden müssen, aber dies ist die Mindestmenge, die ich benötige, damit es funktioniert.
Hier ist ein Beispiel mit Mokka 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));
});
});