13

で Web アプリのロギング モジュールを作成していますnodejsmocha私のモジュールが正しいメッセージを に出力することをテストできるようにしたいと思いますterminal。私は周りを見回してきましたが、これを確認するための明らかな解決策は見つかりませんでした。見つけた

process.stdout.on('data', function (){})

しかし、これを機能させることができませんでした。誰かアドバイスはありますか?

4

3 に答える 3

17

process.stdout'data'読み取り可能なストリームではないため、イベントを発行することはありません。興味がある場合は、ノード ストリームのドキュメントですべてを読むことができます。

私の知る限り、フックまたはキャプチャする最も簡単な方法は、必要なprocess.stdoutことを行う関数process.stderrに置き換えることです。process.stdout.write非常にハッキーなことはわかっていますが、テストシナリオでは、前後のフックを使用してフックが解除されることを確認できるため、多かれ少なかれ無害です。とにかく下層のストリームに書き込むので、フックを解除しなくても世界の終わりではありません。

function captureStream(stream){
  var oldWrite = stream.write;
  var buf = '';
  stream.write = function(chunk, encoding, callback){
    buf += chunk.toString(); // chunk is a String or Buffer
    oldWrite.apply(stream, arguments);
  }

  return {
    unhook: function unhook(){
     stream.write = oldWrite;
    },
    captured: function(){
      return buf;
    }
  };
}

次のようなモカテストで使用できます。

describe('console.log', function(){
  var hook;
  beforeEach(function(){
    hook = captureStream(process.stdout);
  });
  afterEach(function(){
    hook.unhook(); 
  });
  it('prints the argument', function(){
    console.log('hi');
    assert.equal(hook.captured(),'hi\n');
  });
});

注意点があります: mocha レポーターは標準出力に出力します。私が知る限り、サンプル ( it('...',function(){})) 関数の実行中はそうしませんが、サンプル関数が非同期の場合、問題が発生する可能性があります。私はこれについてもっと知ることができるかどうか見ていきます。

于 2013-08-31T00:56:25.277 に答える