----------- ОБНОВЛЕНИЕ ---------------
узел-песочница работает по тем же принципам, что указаны ниже, но обернута в хороший модуль.Мне очень приятно работать.
--------------- подробный awnser ---------------
После долгих испытаний я обнаружил, что лучший способ для проверки узловых модулей изолированно во время макетирования - использовать метод Войты Джины для запуска каждого модуля в виртуальной машине сновый контекст как объяснено здесь .
с этим модулем тестирования vm:
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;
};
можно протестировать каждый модуль с его собственным контекстом и легко заглушить все внешниеdependencys.
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});
Я настоятельно рекомендую этот способ для написания эффективных тестов в изоляции.Только приемочные тесты должны поражать весь стек.Модульные и интеграционные тесты должны проверять изолированные части системы.