Ini adalah contoh sepele yang menggambarkan inti permasalahan saya:
var innerLib = require('./path/to/innerLib');
function underTest() {
return innerLib.doComplexStuff();
}
module.exports = underTest;
Saya mencoba menulis unit test untuk kode ini. Bagaimana saya bisa mengejek persyaratan untuk innerLib
tanpa mengolok-olok require
fungsi sepenuhnya?
Jadi ini saya mencoba untuk mengejek global require
dan mengetahui bahwa itu tidak akan berhasil bahkan untuk melakukan itu:
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;
}
};
Masalahnya adalah bahwa require
fungsi di dalam underTest.js
file sebenarnya belum dipermainkan. Itu masih menunjuk ke require
fungsi global . Jadi sepertinya saya hanya bisa mengejek require
fungsi dalam file yang sama dengan yang saya lakukan mengejek. Jika saya menggunakan global require
untuk memasukkan apa pun, bahkan setelah saya mengganti salinan lokal, file yang diminta masih memiliki require
referensi global .
global.require
. Variabel menulismodule
secara default karena modul memiliki cakupan modul.