РЕДАКТИРОВАТЬ:
Загрузка модуля с использованием vm
может вызвать непредвиденное поведение (например, instanceof
оператор больше не работает с объектами, созданными в таком модуле, поскольку глобальные прототипы отличаются от тех, которые используются в модуле, загружаемом обычно require
). Я больше не использую описанную ниже технику и вместо этого использую модуль rewire . Это работает чудесно. Вот мой оригинальный ответ:
Разработка ответа Сроша ...
Это немного странно, но я написал простой модуль "test_utils.js", который позволит вам делать то, что вы хотите, без условного экспорта в ваших модулях приложения:
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;};
Есть еще несколько вещей, которые включены в module
объект gobal модуля узла, которые также могут потребоватьсяcontext
объект выше, но это минимальный набор, который мне нужен для его работы.
Вот пример использования мокко 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));
});
});