2012-03-07 40 views
10

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

Trả lời

15

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)); 
}; 
20

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.

+0

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

0

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'); 
};