----------- GÜNCELLEME ---------------
node-sandbox işler aşağıda belirtildiği gibi ancak güzel bir modül içinde sarılır. Çalışmak çok güzel buluyorum.
--------------- detaylı Awnser ---------------
Ben çok deneme sonrasında Bir şeyleri alay ederken düğüm modülleri izole ederken test etmek için en iyi yolu bulmuştu Vojta Jina yöntemini kullanarak her modül bir vm içinde açıklandığı gibi yeni bir bağlam here açıklandığı gibi. Bu test vm modülü ile
:
var vm = require('vm');
var fs = require('fs');
var path = require('path');
/**
* Helper for unit testing:
* - load module with mocked dependencies
* - allow accessing private state of the module
*
* @param {string} filePath Absolute path to module (file to load)
* @param {Object=} mocks Hash of mocked dependencies
*/
exports.loadModule = function(filePath, mocks) {
mocks = mocks || {};
// this is necessary to allow relative path modules within loaded file
// i.e. requiring ./some inside file /a/b.js needs to be resolved to /a/some
var resolveModule = function(module) {
if (module.charAt(0) !== '.') return module;
return path.resolve(path.dirname(filePath), module);
};
var exports = {};
var context = {
require: function(name) {
return mocks[name] || require(resolveModule(name));
},
console: console,
exports: exports,
module: {
exports: exports
}
};
vm.runInNewContext(fs.readFileSync(filePath), context);
return context;
};
kendi bağlamı ile her modül test edip kolayca tüm dış dependencys saplama için mümkündür.
fsMock = mocks.createFs();
mockRequest = mocks.createRequest();
mockResponse = mocks.createResponse();
// load the module with mock fs instead of real fs
// publish all the private state as an object
module = loadModule('./web-server.js', {fs: fsMock});
Bu şekilde izolasyonda etkili testler yazmanızı tavsiye ederim. Sadece kabul testleri tüm yığına çarpmalıdır. Birim ve entegrasyon testleri sistemin izole kısımlarını test etmelidir.
Harika cevap için teşekkürler! Ancak başka bir sorum var: Bu tekniği, test edilen modülde özel işlevlerimi kullanarak özel işlevleri geçersiz kılmak için kullanamamıştım. iki işlevle sonuçlanır: biri yerel kapsamda ve küresel kapsamda bir diğeri, test altındaki modül ile her zaman global/orijinal sürümü çağırır. – Attilah