2016-11-13 6 views
0

テストではstderrをファイルにリダイレクトし、末尾のように読み込もうとしました。だからここ は、リダイレクトです:Pythonのテールのようなファイルの読み取り

class RedirectedEnv(object): 
    def __init__(self, stderr=None): 
     self._stderr = stderr or sys.stderr 

    def __enter__(self): 
     self.old_stderr = sys.stderr 
     self.old_stderr.flush() 
     self.old_exit = getattr(sys, 'exit') 
     sys.stderr = self._stderr 

     def mock_exit(): 
      raise Exception 
     sys.exit = mock_exit 

    def __exit__(self, exc_type, exc_val, exc_tb): 
     self._stderr.flush() 
     sys.stderr = self.old_stderr 
     sys.exit = self.old_exit 

     self._stderr.close() 

とその使用方法:

def test_invalid_args(self): 
    with RedirectedEnv(stderr=tempfile.NamedTemporaryFile()): 
     for args in [['-id', '123456789.00'], ['-i'], ['-i', '0'], ['-i', '../some_invalid_path/not_exist.json']]: 
      try: 
       self.parser.parse(args) 
      except Exception: 
       sys.stderr.flush() 
       self.assertTrue(sys.stderr.readlines()[0].startswith("usage:")) <<-- here I need help 

これを行うには、いくつかのエレガントな方法はありますか? (enumeratetell()seek()と混乱させないでください)おそらくファイルインタフェースを持つFIFO queueがありますか?

+0

クラス定義の字下げを修正しました。 – Leva7

+0

なぜ「シーク」が乱雑ですか? 'try'は各ループのファイルを切り捨てるべきではないでしょうか?例外はファイルの先頭を探して行を読み上げるべきではありませんか?あなたのテストケースは、すべての例外をキャッチするという点でちょっと奇妙ですが、オプションリストが例外を発生させるときとそうでないときを区別するようには見えません。これらの検査のいくつかは合格したものの、他の検査は失敗していますか? – tdelaney

+0

すべて失敗するはずです。 argparserがインタプリタを終了しないようにsys.exitを嘲笑し、適切な使用法のメッセージを確認しました。たぶんそれは最善の方法ではない)私は "wb +"でファイルを開き、それを書き直すのではなく最後にコンテンツを追加するので、オフセット= 0にすることはできません。何か不足していますか? – Constantine

答えて

1

各テストごとに新しいファイルを作成して、その値を取得するためにフロントを探すことができます。ファイル名を使用しないので、TemporaryFileに移動しました。

def test_invalid_args(self): 
    for args in [['-id', '123456789.00'], ['-i'], ['-i', '0'], ['-i', '../some_invalid_path/not_exist.json']]: 
     with RedirectedEnv(stderr=tempfile.TemporaryFile()): 
      try: 
       self.parser.parse(args) 
       raise AssertionError("should have failed") 
      except Exception: 
       sys.stderr.seek(0) 
       self.assertTrue(sys.stderr.readline().startswith("usage:")) 
+0

ありがとう、それはまさに私が望んでいたものです。コンパクトで表現力のある、イホ。 – Constantine

関連する問題