यह एक तुच्छ उदाहरण है जो मेरी समस्या की जड़ को दिखाता है:
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
डिफ़ॉल्ट रूप से लिखते हैं क्योंकि मॉड्यूल मॉड्यूल स्कॉप होते हैं।