テストでは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
これを行うには、いくつかのエレガントな方法はありますか? (enumerate
とtell()
とseek()
と混乱させないでください)おそらくファイルインタフェースを持つFIFO queue
がありますか?
クラス定義の字下げを修正しました。 – Leva7
なぜ「シーク」が乱雑ですか? 'try'は各ループのファイルを切り捨てるべきではないでしょうか?例外はファイルの先頭を探して行を読み上げるべきではありませんか?あなたのテストケースは、すべての例外をキャッチするという点でちょっと奇妙ですが、オプションリストが例外を発生させるときとそうでないときを区別するようには見えません。これらの検査のいくつかは合格したものの、他の検査は失敗していますか? – tdelaney
すべて失敗するはずです。 argparserがインタプリタを終了しないようにsys.exitを嘲笑し、適切な使用法のメッセージを確認しました。たぶんそれは最善の方法ではない)私は "wb +"でファイルを開き、それを書き直すのではなく最後にコンテンツを追加するので、オフセット= 0にすることはできません。何か不足していますか? – Constantine