Поймать console.log в node.js? - PullRequest
13 голосов
/ 08 марта 2012

Есть ли способ, которым я могу отловить возможный вывод консоли, вызванный console.log(...) внутри node.js, чтобы предотвратить засорение терминала во время модульного тестирования модуля?

Спасибо

Ответы [ 4 ]

23 голосов
/ 09 марта 2012

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

EDIT

console.log() заканчивает вывод новой строкой, вы можете удалить ее, поэтому лучше написать:

_stream.write = function(string, encoding, fd) {
    var new_str = string.replace(/\n$/, '');
    fn(new_str, encoding, fd);
};

EDIT

Улучшенный общий способ сделать это на любом методе любого объекта с поддержкой асинхронного доступа См. Суть .

16 голосов
/ 08 марта 2012

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));
};
1 голос
/ 19 сентября 2018

захват-консоль хорошо решает эту проблему.

var capcon = require('capture-console');

var stderr = capcon.captureStderr(function scope() {
  // whatever is done in here has stderr captured,
  // the return value is a string containing stderr
});

var stdout = capcon.captureStdout(function scope() {
  // whatever is done in here has stdout captured,
  // the return value is a string containing stdout
});

и позже

Перехват

Вы должны знать, что всеcapture функции будут по-прежнему передавать значения основным функциям stdio write(), поэтому регистрация будет по-прежнему идти на ваши стандартные устройства ввода-вывода.

Если это нежелательно, вы можете использовать функции intercept,Эти функции буквально s/capture/intercept по сравнению с показанными выше, и единственное отличие состоит в том, что вызовы не перенаправляются в базовую реализацию.

0 голосов
/ 15 ноября 2015

Просто добавьте следующий фрагмент кода в свой код, чтобы вы могли перехватить логи и все же распечатать их в консоли:

var log = [];
console.log = function(d) {
    log.push(d);
    process.stdout.write(d + '\n');
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...