Редагувати:
Завантаження модуля за допомогою vm
може спричинити несподівану поведінку (наприклад, instanceof
оператор більше не працює з об'єктами, створеними в такому модулі, оскільки глобальні прототипи відрізняються від тих, які використовуються в модулі, завантаженому зазвичайrequire
). Я більше не використовую наведену нижче техніку і замість цього використовую модуль перемотування . Це чудово працює. Ось моя оригінальна відповідь:
Робота над грошовою відповіддю ...
Це здається трохи хитким, але я написав простий модуль "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
об'єкт який також може знадобитися перейти вcontext
об'єкт вище, але це мінімальний набір, який мені потрібен для роботи.
Ось приклад використання 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));
});
});