Có cách nào để tôi có thể bắt đầu ra bàn điều khiển cuối cùng gây ra bởi console.log(...)
trong node.js để ngăn chặn việc ngắt thiết bị đầu cuối trong khi đơn vị kiểm tra mô-đun không?Bắt console.log trong node.js?
Cảm ơn
Có cách nào để tôi có thể bắt đầu ra bàn điều khiển cuối cùng gây ra bởi console.log(...)
trong node.js để ngăn chặn việc ngắt thiết bị đầu cuối trong khi đơn vị kiểm tra mô-đun không?Bắt console.log trong node.js?
Cảm ơn
module.js:
module.exports = function() {
console.log("foo");
}
chương trình:
console.log = function() {};
mod = require("./module");
mod();
// Look ma no output!
Edit: Rõ ràng bạn có thể thu thập các thông điệp log cho sau này nếu bạn muốn:
var log = [];
console.log = function() {
log.push([].slice.call(arguments));
};
Một cách tốt hơn có thể là kết nối trực tiếp đầu ra mà bạn cần để nắm bắt dữ liệu, bởi vì với phương pháp Linus nếu một số mô-đun ghi trực tiếp vào stdout với process.stdout.write('foo')
chẳng hạn, nó sẽ không bị bắt.
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()
kết thúc sản lượng của nó với một dòng mới, bạn có thể muốn lột nó, do đó bạn muốn viết tốt hơn:
_stream.write = function(string, encoding, fd) {
var new_str = string.replace(/\n$/, '');
fn(new_str, encoding, fd);
};
EDIT
Cải thiện , cách chung để thực hiện điều này trên bất kỳ phương thức nào của bất kỳ đối tượng nào có hỗ trợ async See the gist.
Chỉ cần thêm đoạn mã sau vào mã của bạn sẽ cho phép bạn bắt các bản ghi và vẫn in nó trong giao diện điều khiển:
var log = [];
console.log = function(d) {
log.push(d);
process.stdout.write(d + '\n');
};
vĩ đại giải pháp @kevin - Đây chỉ giúp tôi ra rất nhiều với một thử nghiệm - thậm chí xấp xỉ 5 năm sau. Thumbs up! – RobC