EDIT:
Memuat modul menggunakan vm
dapat menyebabkan perilaku yang tidak terduga (misalnya instanceof
operator 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 module
objek gobal modul simpul yang mungkin juga perlu masuk ke context
objek 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));
});
});