Utilizo este administrador de contexto para capturar la salida. En última instancia, utiliza la misma técnica que algunas de las otras respuestas reemplazando temporalmente sys.stdout
. Prefiero el administrador de contexto porque envuelve toda la contabilidad en una sola función, por lo que no tengo que volver a escribir ningún código de prueba final, y no tengo que escribir funciones de configuración y desmontaje solo para esto.
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
Úselo así:
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!')
Además, dado que el estado de salida original se restaura al salir del with
bloque, podemos configurar un segundo bloque de captura en la misma función que el primero, lo cual no es posible usando las funciones de configuración y desmontaje, y se vuelve prolijo al escribir try-finalmente bloques manualmente. Esa capacidad resultó útil cuando el objetivo de una prueba era comparar los resultados de dos funciones entre sí en lugar de con algún valor precalculado.
with mock.patch('sys.stdout', new_callable=StringIO.StringIO):
pypi.python.org/pypi/mock