----------- --------------- ACTUALIZACIÓN
node-sandbox trabajos sobre los mismos principios que se establecen a continuación, pero está envuelto en un buen módulo. Me resulta muy agradable trabajar con.
--------------- awnser detallada ---------------
Después de mucho ensayo que tengo La mejor manera de probar los módulos de nodo de forma aislada, mientras que burlarse de todo es usar el método de Vojta Jina para ejecutar cada módulo dentro de una vm con un nuevo contexto como se explica here.
con este módulo VM de pruebas:
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;
};
es posible probar cada módulo con su propio contexto y fácilmente apagar todos dependencys externos.
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});
Recomiendo esta manera de escribir pruebas efectivas de forma aislada. Solo las pruebas de aceptación deberían llegar a toda la pila. Las pruebas de unidad e integración deben probar partes aisladas del sistema.
¡Gracias por la gran respuesta! Sin embargo, tengo otra pregunta: No pude aprovechar esta técnica para anular las funciones privadas con las mías personalizadas en el módulo que se está probando. resulta en dos funciones: una en el ámbito local y otra en el ámbito global, con el módulo bajo prueba siempre llamando a la versión global/original. – Attilah