В тесте я перенаправил stderr
в файл и попытался прочесть его хвостовым способом. Так вот Перенаправление:Python tail-like file read
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
Все должно потерпеть неудачу. Я издевался над sys.exit, чтобы предотвратить переход от переводчика, чтобы проверить правильность использования сообщения. Возможно, это не лучший способ). Я открыл файл с помощью «wb +», и он добавляет контент в конец, а не переписывает его, поэтому я не могу просто искать смещение = 0. Я что-то упускаю? – Constantine