----------- UPDATE ---------------
node-sandbox opere sugli stessi principi sotto enunciati, ma è racchiuso in un bel modulo. Sto trovando molto bello lavorare con.
--------------- awnser dettagliata ---------------
Dopo molti tentativi ho ha trovato il modo migliore per testare i moduli dei nodi in isolamento mentre sbeffeggiava le cose è usare il metodo di Vojta Jina per eseguire ogni modulo all'interno di un vm con un nuovo contesto come spiegato here.
con questo modulo vm test:
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;
};
è possibile testare ogni unità con il proprio contesto e facilmente spegnere tutti dependencys esterni.
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});
Consiglio vivamente questo modo di scrivere test efficaci isolati. Solo i test di accettazione dovrebbero colpire l'intero stack. I test di unità e integrazione dovrebbero testare parti isolate del sistema.
fonte
2012-06-03 11:15:54
Grazie per l'ottima risposta! Comunque ho un'altra domanda: Non ero in grado di sfruttare questa tecnica per scavalcare le funzioni private con quelle personalizzate nel modulo in fase di test. ha come risultato due funzioni: una nell'ambito locale e un'altra nell'ambito globale, con il modulo in prova che chiama sempre la versione globale/originale. – Attilah