最終的なコンソールの出力をnode.js内のconsole.log(...)
によって検出する方法はありますか?モジュールのユニットテスト中に端末が詰まるのを防ぐには?node.jsのconsole.logをキャッチしますか?
おかげ
最終的なコンソールの出力をnode.js内のconsole.log(...)
によって検出する方法はありますか?モジュールのユニットテスト中に端末が詰まるのを防ぐには?node.jsのconsole.logをキャッチしますか?
おかげ
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の方法では、一部のモジュールが例えば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);
});
EDIT
console.log()
は改行と、その出力を終了し、あなたがより良い記述しますので、あなたはそれを取り除くしたいことがあります。改善された
_stream.write = function(string, encoding, fd) {
var new_str = string.replace(/\n$/, '');
fn(new_str, encoding, fd);
};
EDIT
を非同期サポートを持つオブジェクトの任意のメソッドでこれを行う一般的な方法See the gist。
単にあなたのコードに次のコードを使用して、ログをキャッチし、まだコンソールでそれを印刷できるようになる追加:@kevin
var log = [];
console.log = function(d) {
log.push(d);
process.stdout.write(d + '\n');
};
グレートソリューション - これは単なるテストでそんなに私を助けた - でも約5年後。いいぞ! – RobC