นี่เป็นตัวอย่างเล็กน้อยที่แสดงให้เห็นถึงปมปัญหาของฉัน:
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
เป็นค่าเริ่มต้นเนื่องจากโมดูลเป็นโมดูลที่กำหนดขอบเขต