แก้ไข:
การโหลดโมดูลที่ใช้vm
อาจทำให้เกิดพฤติกรรมที่ไม่คาดคิด (เช่นinstanceof
ผู้ปฏิบัติงานไม่สามารถทำงานกับวัตถุที่สร้างขึ้นในโมดูลดังกล่าวได้อีกต่อไปเพราะต้นแบบระดับโลกนั้นแตกต่างจากต้นแบบที่ใช้ในโมดูลที่โหลดตามปกติrequire
) ฉันไม่ได้ใช้เทคนิคด้านล่างอีกต่อไปและใช้โมดูลrewireแทน มันใช้งานได้อย่างยอดเยี่ยม นี่คือคำตอบเดิมของฉัน:
อธิบายอย่างละเอียดเกี่ยวกับคำตอบของ srosh ...
รู้สึกแฮ็คเล็กน้อย แต่ฉันเขียนโมดูล "test_utils.js" ที่ควรอนุญาตให้คุณทำสิ่งที่คุณต้องการโดยไม่ต้องส่งออกตามเงื่อนไขในโมดูลแอปพลิเคชันของคุณ:
var Script = require('vm').Script,
fs = require('fs'),
path = require('path'),
mod = require('module');
exports.expose = function(filePath) {
filePath = path.resolve(__dirname, filePath);
var src = fs.readFileSync(filePath, 'utf8');
var context = {
parent: module.parent, paths: module.paths,
console: console, exports: {}};
context.module = context;
context.require = function (file){
return mod.prototype.require.call(context, file);};
(new Script(src)).runInNewContext(context);
return context;};
มีบางสิ่งเพิ่มเติมที่รวมอยู่ในmodule
วัตถุgobal ของโหนดโมดูลที่อาจต้องเข้าสู่context
วัตถุด้านบนด้วย แต่นี่เป็นชุดขั้นต่ำที่ฉันต้องการเพื่อให้ทำงานได้
นี่คือตัวอย่างการใช้มอคค่า BDD:
var util = require('./test_utils.js'),
assert = require('assert');
var appModule = util.expose('/path/to/module/modName.js');
describe('appModule', function(){
it('should test notExposed', function(){
assert.equal(6, appModule.notExported(3));
});
});