¿Hay alguna manera de que pueda detectar la salida de la consola eventual causada por console.log(...)
dentro de node.js para evitar la obstrucción del terminal mientras la unidad prueba un módulo?Captura de console.log en node.js?
Gracias
¿Hay alguna manera de que pueda detectar la salida de la consola eventual causada por console.log(...)
dentro de node.js para evitar la obstrucción del terminal mientras la unidad prueba un módulo?Captura de console.log en node.js?
Gracias
module.js:
module.exports = function() {
console.log("foo");
}
programa:
console.log = function() {};
mod = require("./module");
mod();
// Look ma no output!
Editar: Obviamente se puede recoger los mensajes de registro para más adelante si lo desea:
var log = [];
console.log = function() {
log.push([].slice.call(arguments));
};
Una forma mejor podría ser conectar directamente la salida que necesita para capturar datos, porque con el método de Linus si algún módulo escribe directamente en stdout con process.stdout.write('foo')
, por ejemplo, no será capturado.
var logs = [],
hook_stream = function(_stream, fn) {
// Reference default write method
var old_write = _stream.write;
// _stream now write with our shiny function
_stream.write = fn;
return function() {
// reset to the default write method
_stream.write = old_write;
};
},
// hook up standard output
unhook_stdout = hook_stream(process.stdout, function(string, encoding, fd) {
logs.push(string);
});
// goes to our custom write method
console.log('foo');
console.log('bar');
unhook_stdout();
console.log('Not hooked anymore.');
// Now do what you want with logs stored by the hook
logs.forEach(function(_log) {
console.log('logged: ' + _log);
});
EDITAR
console.log()
termina su producción con una nueva línea, es posible que desee despojarlo así que es mejor escribir:
_stream.write = function(string, encoding, fd) {
var new_str = string.replace(/\n$/, '');
fn(new_str, encoding, fd);
};
EDITAR
mejorada , manera genérica de hacer esto en cualquier método de cualquier objeto con soporte asíncrono See the gist.
sólo tiene que añadir el siguiente fragmento de código le permitirá capturar los registros y todavía lo imprime en la consola:
var log = [];
console.log = function(d) {
log.push(d);
process.stdout.write(d + '\n');
};
Gran solución @ Kevin - Esto me ayudó a cabo tanto con una prueba - incluso aprox 5 años después. ¡Pulgares hacia arriba! – RobC