2011-12-15 11 views
11

Ho un modulo python di terze parti difettoso che viene emesso su stdout o stderr mentre è importato e questo sta interrompendo l'output dei miei unittests.Come nascondere temporaneamente stdout o stderr durante l'esecuzione di un unittest in Python

Come è possibile reindirizzare temporaneamente lo stdout per nascondere l'output.

Limitato a Python 2.5 sintassi :)

aggiornamento, ho dimenticato di dire che sys.stdout e sys.__stderr__ metodi non funzionano in questo caso. Per quanto ne so questo modulo difettoso sta usando il codice nativo.

risposta

16

si può fare qualcosa di simile:

>>> import sys, os 
>>> _stderr = sys.stderr 
>>> _stdout = sys.stdout 
>>> null = open(os.devnull,'wb') 
>>> sys.stdout = sys.stderr = null 
>>> print "Bleh" 
>>> sys.stderr = _stderr 
>>> sys.stdout = _stdout 
>>> print "Bleh" 
Bleh 
+6

'os.devnull', ho imparato qualcosa! +1 – juliomalegria

+0

L'esempio dovrebbe funzionare, ho anche provato a cambiare 'sys .__ stdout__' e' sys .__ stderr__', ma ottengo ancora l'output ': [' – sorin

20

È inoltre possibile utilizzare mock per far si applica una patch sys.stdout e sys.stderr per voi quando il modulo viene importato. Un esempio di un modulo di test che l'utilizzo di questa strategia potrebbe essere:

import os 
devnull = open(os.devnull, 'w') 

from mock import patch 
with patch('sys.stdout', devnull): 
    with patch('sys.stderr', devnull): 
     import bad_module 

# Test cases writen here 

dove bad_module è il terzo modulo partito che è la stampa a sys.stdout e sys.stderr quando viene importato.

+0

Questa parte '' mock'' della soluzione funzionerebbe se lo 'stdout'? è stato scritto durante l'importazione come indicato dall'OP? – MattH

+0

@MattH Hai ragione, l'esempio è sbagliato. Ho risposto alla mia risposta per correggere sys.stdout e sys.stderr solo quando il modulo è stato importato. Grazie per il vostro feedback – jcollado

+0

+1 Interessante, non ho familiarità con 'mock'. Suppongo che tu non abbia più bisogno di "import unittest'. – MattH

Problemi correlati