EDIT:
Memuat modul menggunakan vmdapat menyebabkan perilaku yang tidak terduga (misalnya instanceofoperator tidak lagi bekerja dengan objek yang dibuat dalam modul seperti itu karena prototipe global berbeda dari yang digunakan dalam modul yang dimuat secara normal dengan require). Saya tidak lagi menggunakan teknik di bawah ini dan sebagai gantinya menggunakan modul rewire . Ini bekerja dengan sangat baik. Inilah jawaban asli saya:
Menguraikan jawaban srosh ...
Rasanya agak gila, tapi saya menulis modul "test_utils.js" sederhana yang akan memungkinkan Anda melakukan apa yang Anda inginkan tanpa memiliki ekspor bersyarat dalam modul aplikasi Anda:
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;};
Ada beberapa hal lagi yang termasuk dalam moduleobjek gobal modul simpul yang mungkin juga perlu masuk ke contextobjek di atas, tetapi ini adalah set minimum yang saya butuhkan agar bisa berfungsi.
Berikut ini contoh menggunakan mocha 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));
});
});