我是否有办法在node.js中捕获由console.log(...)
引起的最终控制台输出,以防止在单元测试模块时堵塞终端?
由于
答案 0 :(得分:23)
更好的方法是直接连接你需要捕获数据的输出,因为使用Linus方法,如果某个模块直接写入带有process.stdout.write('foo')
的stdout,它就不会被捕获。
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);
};
修改强>
使用异步支持See the gist的任何对象的任何方法执行此操作的改进的通用方法。
答案 1 :(得分:16)
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));
};
答案 2 :(得分:1)
capture-console很好地解决了这个问题。
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
函数仍会将值传递给主stdiowrite()
函数,因此日志记录仍将进入标准IO设备。如果不希望这样做,可以使用
intercept
函数。与上面显示的功能相比,这些功能在字面上是s/capture/intercept
,唯一的区别是调用不会转发到基本实现。
答案 3 :(得分:0)
只需将以下代码段添加到您的代码中,您就可以捕获日志并仍然在控制台中打印:
var log = [];
console.log = function(d) {
log.push(d);
process.stdout.write(d + '\n');
};