यह एक तुच्छ उदाहरण है जो मेरी समस्या की जड़ को दिखाता है:
var innerLib = require('./path/to/innerLib');
function underTest() {
return innerLib.doComplexStuff();
}
module.exports = underTest;
मैं इस कोड के लिए एक इकाई परीक्षण लिखने की कोशिश कर रहा हूं। मैं फंक्शन को पूरी तरह से मॉक innerLibकिए बिना आवश्यकता का मजाक कैसे उड़ा सकता हूं require?
तो यह मैं वैश्विक का मजाक उड़ाने की कोशिश कर रहा हूं requireऔर यह पता लगा रहा हूं कि ऐसा करने से भी काम नहीं चलेगा:
var path = require('path'),
vm = require('vm'),
fs = require('fs'),
indexPath = path.join(__dirname, './underTest');
var globalRequire = require;
require = function(name) {
console.log('require: ' + name);
switch(name) {
case 'connect':
case indexPath:
return globalRequire(name);
break;
}
};
समस्या यह है कि फ़ाइल के requireअंदर फ़ंक्शन underTest.jsवास्तव में मॉक आउट नहीं किया गया है। यह अभी भी वैश्विक requireकार्य की ओर इशारा करता है। तो ऐसा लगता है कि मैं केवल requireउसी फ़ाइल के भीतर फ़ंक्शन को मॉक कर सकता हूं जो मैं मॉकिंग कर रहा हूं। यदि मैं requireकिसी भी चीज़ को शामिल करने के लिए वैश्विक का उपयोग करता हूं , भले ही मैंने स्थानीय प्रतिलिपि को ओवरराइड कर दिया हो, तो आवश्यक फाइलें अभी भी होंगी। वैश्विक requireसंदर्भ।
global.require। चरmoduleडिफ़ॉल्ट रूप से लिखते हैं क्योंकि मॉड्यूल मॉड्यूल स्कॉप होते हैं।