2016-02-03 1 views
1

Unittest simple ci-dessous.Pourquoi ce test échoue-t-il lorsque pdb.set_trace() est appelé?

Si je l'exécute (par exemple, python -m unittest nom_module) sans 'test' comme argument, cela passe. Si je l'exécute avec 'test' comme argument, j'obtiens "TypeError: type d'argument incorrect pour l'opération intégrée". Pourquoi?

from io import StringIO 
import sys 
from unittest import TestCase 

class TestSimple(TestCase): 
    def test_simple(self): 
     old_stdout = sys.stdout 
     buf = StringIO() 
     try: 
      sys.stdout = buf 
      print('hi') 
     finally: 
      import pdb 
      if 'test' in sys.argv: 
       pdb.set_trace() 
      sys.stdout = old_stdout 

version contextlib.redirect_stdout:

from contextlib import redirect_stdout 
from io import StringIO 
import pdb 
import sys 
from unittest import TestCase 

class TestSimple(TestCase): 
    def test_simple(self): 
     buf = StringIO() 
     with redirect_stdout(buf): 
      print('hi') 
      pdb.set_trace() 
     print('finis') 

Merci à l'avance.

Edit: Le programme original a été testé en Python 3.4 dans Debian et Windows 7.

Quelque chose de similaire (en utilisant des drapeaux de l'environnement au lieu d'un argument de ligne de commande) semble se bloquer en Python 2, mais en appuyant sur c lui permet de terminer, donc je suppose qu'il pourrait juste être que l'interface utilisateur de pdb a été redirigé.Mais la version Python 3 a le comportement décrit initialement (plantage), même si un collègue testé sur 3.4 sur Mac OS et vu le "hang" "comportement.

+1

On dirait que 'pdb' a un problème avec stdout ne pas être "normal" quand vous l'appelez. Si vous déplacez la ligne qui remplace stdout standard au-dessus de 'set_trace' cela fonctionne très bien. Même si vous utilisez 'contextlib.redirect_stdout' au lieu de l'assigner manuellement, ce qui est probablement ce que vous devriez faire en premier lieu .. – tzaman

+0

J'ai effectivement eu l'erreur à l'origine en utilisant contextlib.redirect_stdout - remplacé juste pour essayer de faire le émettre plus clair. Je vais l'ajouter à la description ci-dessus. – AdamC

+0

Malheureusement, j'avais besoin de pdb ** dans ** l'instruction with. – AdamC

Répondre

4

Vous devez donner pdb le stdout d'origine:

pdb.Pdb(stdout=sys.__stdout__).set_trace() 
+0

Merci! Je me demande pourquoi Pdb ne fait pas ça tout seul. Mais il a effectivement résolu mon problème. – AdamC