2016-02-03 3 views
1

Простой unittest ниже.Почему этот тестовый сбой при вызове pdb.set_trace()?

Если я запустил его (например, python -m unittest module_name) без «теста» в качестве аргумента, он пройдет. Если я запустил его с «test» в качестве аргумента, я получаю «TypeError: неправильный тип аргумента для встроенной операции». Зачем?

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 

версия 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') 

Спасибо заранее.

Edit: Оригинальная программа была опробована в Python 3.4 и в Debian и под управлением Windows 7.

Нечто подобное (с использованием среды флагов вместо строки аргумента команды), чтобы повесить в Python 2, но нажатие c позволяет ему закончить, поэтому я предполагаю, что это может быть просто в том, что пользовательский интерфейс pdb был перенаправлен. Но версия Python 3 имеет описанное поведение (сбои), хотя коллега тестировал 3,4 на Mac OS и видел, как «зависают» «поведение.

+1

Похоже, 'pdb' имеет проблемы с стандартным выводом не является«нормальным», когда вы вызываете его. Если вы перемещаете строку, заменяющую стандартную stdout над «set_trace», она отлично работает. То же самое, если вы используете 'contextlib.redirect_stdout' вместо того, чтобы вручную назначать его, что, вероятно, вы должны делать в первую очередь. – tzaman

+0

Я действительно получил ошибку изначально с помощью contextlib.redirect_stdout - заменил ее просто, чтобы попытаться сделать выпуск более четкий. Я добавлю это к описанию выше. – AdamC

+0

К сожалению, мне нужно было pdb ** внутри ** с инструкцией. – AdamC

ответ

4

Вы должны дать pdb оригинального stdout:

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

Спасибо! Заставляет меня задаться вопросом, почему Pdb не просто делает это сам. Но это действительно решило мою проблему. – AdamC

Смежные вопросы