संपादित करें:
किसी मॉड्यूल का उपयोग करने से 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
ऑब्जेक्ट में शामिल हैं जिन्हें अंदर जाने की भी आवश्यकता हो सकती है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));
});
});