EDYTOWAĆ:
Ładowanie modułu za pomocą vm
może spowodować nieoczekiwane zachowanie (np. instanceof
Operator nie pracuje już z obiektami, które są tworzone w takim module, ponieważ prototypy globalne różnią się od tych używanych w module ładowanym normalnie require
). Nie używam już poniższej techniki i zamiast tego używam modułu rewire . Działa wspaniale. Oto moja oryginalna odpowiedź:
Rozwijając odpowiedź Srosha ...
Wydaje się to trochę hakerskie, ale napisałem prosty moduł "test_utils.js", który powinien pozwolić ci robić to, co chcesz, bez warunkowego eksportowania w modułach aplikacji:
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;};
Jest jeszcze kilka rzeczy, które są zawarte w module
obiekcie globalnym modułu węzła, które mogą również wymagać przejścia do context
powyższego obiektu, ale jest to minimalny zestaw, którego potrzebuję, aby działał.
Oto przykład użycia mokki 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));
});
});