Bu benim sorunumun temelini gösteren önemsiz bir örnek:
var innerLib = require('./path/to/innerLib');
function underTest() {
return innerLib.doComplexStuff();
}
module.exports = underTest;
Bu kod için bir birim testi yazmaya çalışıyorum. İşlevi tamamen innerLibalay etmeden gereksinimi nasıl alay edebilirim require?
Bu yüzden küresel olanı alay etmeye çalışıyorum requireve bunu yapmak için bile işe yaramayacağını buluyorum:
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;
}
};
Sorun, dosya requireiçindeki işlevin underTest.jsaslında alay edilmemiş olmasıdır. Hala küresel requirefonksiyona işaret ediyor . Bu yüzden sadece requirealaycı yaptığım aynı dosya içindeki işlevi alay edebilirim gibi görünüyor . Eğer requireyerel kopyayı geçersiz kıldıktan sonra bile, herhangi bir şeyi dahil etmek için küresel kullanırsam, gerekli dosyalar hala küresel requirebaşvuru.
global.require. Değişkenlermodule, modüller kapsam dahilinde olduğu için varsayılan olarak yazılır .