Как часть попытки протестировать побочный эффект унаследованной функции 'print to stdout', я хочу захватить stdout для последующего воспроизведения. Я использую mock
.
цели (выполнить как можно больше!)
- 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