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 innerLib
alay etmeden gereksinimi nasıl alay edebilirim require
?
Bu yüzden küresel olanı alay etmeye çalışıyorum require
ve 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 require
içindeki işlevin underTest.js
aslında alay edilmemiş olmasıdır. Hala küresel require
fonksiyona işaret ediyor . Bu yüzden sadece require
alaycı yaptığım aynı dosya içindeki işlevi alay edebilirim gibi görünüyor . Eğer require
yerel kopyayı geçersiz kıldıktan sonra bile, herhangi bir şeyi dahil etmek için küresel kullanırsam, gerekli dosyalar hala küresel require
başvuru.
global.require
. Değişkenlermodule
, modüller kapsam dahilinde olduğu için varsayılan olarak yazılır .