J'ai utiliser ce gestionnaire de contexte de sortie de capture. Au final, il utilise la même technique que sur certains autres réponses qui remplace temporairement sys.stdout
. Je préfère le gestionnaire de contexte car il embrasse tous la tenue de la comptabilité dans une seule fonction, donc je ne pas avoir à ré-écrire tout essayer enfin de code, et je n'ai pas à écrire l'installation et le démontage des fonctions juste pour cela.
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
L'utiliser comme ceci:
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!')
En outre, depuis l'origine de l'état de sortie est restauré à la sortie de l' with
bloc, nous pouvons mettre en place une capture deuxième bloc dans la même fonction que le premier, ce qui n'est pas possible à l'aide de l'installation et le démontage des fonctions, et obtient verbeux lors de l'écriture essayez-enfin blocs manuellement. Cette capacité est venu dans maniable quand le but d'un test est de comparer les résultats de deux fonctions les uns par rapport aux autres plutôt que pour certains précalculées valeur.