Простой 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 и видел, как «зависают» «поведение.
Похоже, 'pdb' имеет проблемы с стандартным выводом не является«нормальным», когда вы вызываете его. Если вы перемещаете строку, заменяющую стандартную stdout над «set_trace», она отлично работает. То же самое, если вы используете 'contextlib.redirect_stdout' вместо того, чтобы вручную назначать его, что, вероятно, вы должны делать в первую очередь. – tzaman
Я действительно получил ошибку изначально с помощью contextlib.redirect_stdout - заменил ее просто, чтобы попытаться сделать выпуск более четкий. Я добавлю это к описанию выше. – AdamC
К сожалению, мне нужно было pdb ** внутри ** с инструкцией. – AdamC