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
是否有某種優雅的方式來做到這一點? (不要弄得enumerate
和tell()
與seek()
)也許有一些FIFO queue
與文件接口?
修復類定義中的縮進 – Leva7
爲什麼'seek'亂七八糟?不應該'try'在每個循環中截斷文件,並且不應該將異常尋找到文件的前面並讀取一行?你的測試案例有點奇怪,它捕獲了所有的異常,但似乎沒有區分選項列表何時應該引發異常和何時不應該引發異常。這些測試中的一些應該通過而其他測試失敗? – tdelaney
所有應該失敗。我嘲笑sys.exit以防止argparser退出解釋器,檢查正確的使用信息。也許這不是最好的方法)我用「wb +」打開文件,它添加內容到最後,而不是重寫它,所以我不能只求偏移量= 0。我錯過了什麼嗎? – Constantine