Я використовую цей контекстний менеджер для збору результатів. Зрештою, він використовує ту саму техніку, що і деякі інші відповіді тимчасово замінюючи sys.stdout
. Я віддаю перевагу контекстному менеджеру, тому що він об'єднує всі бухгалтерії в одну функцію, тому мені не потрібно переписувати будь-який код пробного останнього, і мені не потрібно писати функції налаштування та відключення саме для цього.
import sys
from contextlib import contextmanager
from StringIO import StringIO
@contextmanager
def captured_output():
new_out, new_err = StringIO(), StringIO()
old_out, old_err = sys.stdout, sys.stderr
try:
sys.stdout, sys.stderr = new_out, new_err
yield sys.stdout, sys.stderr
finally:
sys.stdout, sys.stderr = old_out, old_err
Використовуйте його так:
with captured_output() as (out, err):
foo()
# This can go inside or outside the `with` block
output = out.getvalue().strip()
self.assertEqual(output, 'hello world!')
Крім того, оскільки вихідний стан виходу відновлюється після виходу з with
блоку, ми можемо встановити другий блок захоплення в тій же функції, що і перший, що неможливо за допомогою функцій настройки та вилучення, і отримує слово під час написання спробувати блоки вручну. Ця здатність виявилася корисною, коли метою тесту було порівняння результатів двох функцій відносно один одного, а не якогось попереднього обчисленого значення.
with mock.patch('sys.stdout', new_callable=StringIO.StringIO):
pypi.python.org/pypi/mock