แก้ไข:
การโหลดโมดูลที่ใช้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));
  });
});