Używam tego menedżera kontekstu do przechwytywania danych wyjściowych. Ostatecznie wykorzystuje tę samą technikę, co niektóre inne odpowiedzi, tymczasowo zastępując sys.stdout
. Wolę menedżera kontekstu, ponieważ zawija on całą księgowość w jedną funkcję, więc nie muszę ponownie pisać żadnego kodu próbnego i nie muszę pisać funkcji konfiguracji i dezaktywacji tylko w tym celu.
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
Użyj tego w ten sposób:
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!')
Ponadto, ponieważ pierwotny stan wyjściowy jest przywracany po wyjściu z with
bloku, możemy ustawić drugi blok przechwytywania w tej samej funkcji co pierwszy, co nie jest możliwe przy użyciu funkcji konfiguracji i porzucania, i staje się rozwlekłe podczas pisania try-last blokuje się ręcznie. Zdolność ta przydała się, gdy celem testu było porównanie wyników dwóch funkcji względem siebie, a nie z jakąś wstępnie obliczoną wartością.
with mock.patch('sys.stdout', new_callable=StringIO.StringIO):
pypi.python.org/pypi/mock