レガシー関数の 'print to stdout'副作用をテストしようとする中で、後で再生するためにstdoutをキャプチャしたいと考えています。私はmock
を使用します。後で再生するためにStdoutをキャプチャするわかりやすい方法は?
目標(可能な限り多くを果たす!)それは通常どおり
- stdoutがまだ印刷しますが、追加のレコーダー
- があり、理想的に、これは「パッチを適用」しなければならないかだけコンテキストで発生
私の実装(下記)は少し重い/グロスのようなパッチがあります。それを行うための衛生的な方法がありますか? cStringIO
? mock
のより良い部分私は使用することができます、むしろ私の__getattr__
ハック?
class StreamCapturing(object):
def __init__(self, stream):
self.captured = []
self.stream = stream
def __getattr__(self,attr):
return getattr(self.stream,attr)
def write(self, data):
self.captured.append(data)
self.stream.write(data)
import sys
import mock
with mock.patch('sys.stdout',StreamCapturing(sys.stdout)) as ctx:
sys.stdout.write('a\n')
print 'stdout'
sys.__stdout__.write("the real one\n")
print sys.stdout.captured
sys.stdout.flush()
assert getattr(sys.stdout,'captured') is None
理由あなたは '__getattr__'を定義していますか?基礎となる文字列に 'write'と' flush'呼び出しを渡すだけで十分です。それ以外のコードは、出力を保存するために配列に追加するのではなく、cStringIOを使用する点を除いて、私にはよく見えます。 –
'' __getattr__''は、他のすべてのメソッド呼び出しが渡すようになっています(flush、closeなど)。配列を使用するのは主に、キャプチャしたデータを表示したいときに処理する方が簡単でした。 –