【发布时间】:2011-09-09 19:16:59
【问题描述】:
作为尝试测试遗留函数的“打印到标准输出”副作用的一部分,我想捕获标准输出以供以后重播。我使用mock。
目标(尽可能多地实现!)
- stdout 仍会在正常情况下打印,但有一个额外的记录器
- 理想情况下,这应该被“修补”或仅在上下文中出现
我的实现(如下)的补丁看起来有点重/粗。有没有更明智的方法来做到这一点? cStringIO?我可以使用mock 的任何更好的部分,而不是我的__getattr__ hack?
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__是这样所有其他方法调用将继续传递(刷新、关闭等)。使用数组主要是这样当我想查看捕获的数据时处理起来更简单。
标签: python stream mocking stdout