Есть ли способ, которым я могу поймать конечный вывод консоли, вызванный console.log(...)
внутри node.js, чтобы предотвратить засорение терминала при модуле тестирования модуля?
Спасибо
Есть ли способ, которым я могу поймать конечный вывод консоли, вызванный console.log(...)
внутри node.js, чтобы предотвратить засорение терминала при модуле тестирования модуля?
Спасибо
module.js:
module.exports = function() {
console.log("foo");
}
Программа:
console.log = function() {};
mod = require("./module");
mod();
// Look ma no output!
Изменить: Очевидно, что вы можете собирать сообщения журнала позже, если хотите:
var log = [];
console.log = function() {
log.push([].slice.call(arguments));
};
Лучше всего было бы напрямую подключить вывод, который вам нужно поймать, потому что с помощью метода Linus, если какой-либо модуль записывает непосредственно в stdout с помощью process.stdout.write('foo')
, например, его не поймают.
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);
});
ИЗМЕНИТЬ
console.log()
завершает вывод с помощью новой строки, вы можете снять его, чтобы лучше писать:
_stream.write = function(string, encoding, fd) {
var new_str = string.replace(/\n$/, '');
fn(new_str, encoding, fd);
};
ИЗМЕНИТЬ
Улучшенный общий способ сделать это по любому методу любого объекта с поддержкой async См. раздел.
Просто добавьте следующий фрагмент кода в свой код, чтобы вы могли ловить журналы и все еще печатать его на консоли:
var log = [];
console.log = function(d) {
log.push(d);
process.stdout.write(d + '\n');
};