Есть ли способ, которым я могу поймать конечный вывод консоли, вызванный 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');
};