DÜZENLE:
Modül kullanarak bir modül vm
yüklemek beklenmedik davranışlara neden olabilir (örn. instanceof
Operatör artık böyle bir modülde oluşturulan nesnelerle çalışmaz, çünkü global prototipler normal olarak yüklenen modülde kullanılanlardan farklıdır require
). Artık aşağıdaki tekniği kullanmıyorum ve bunun yerine rewire modülünü kullanıyorum. Harika çalışıyor. İşte benim orijinal cevabım:
Srosh'un cevabı üzerinde duruluyor ...
Biraz kibirli hissettiriyor, ancak uygulama modüllerinizde koşullu dışa aktarmalar olmadan istediğinizi yapmanıza izin vermesi gereken basit bir "test_utils.js" modülü yazdım:
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;};
Bir düğüm modülünün gobal module
nesnesine dahil olan ve context
yukarıdaki nesneye de girmesi gerekebilecek daha fazla şey var , ancak çalışması için gereken minimum kümedir.
Mocha BDD kullanan bir örnek:
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));
});
});