Doctest терпит неудачу, когда нормальный вывод и исключение смешаны вместе?
Есть ли doctest
поддерживать, что и выход и исключение смешаны вместе?
Одним из примеров является:
>>> def foo():
... print 'hello world!'
>>> foo()
hello world!
>>> def bar():
... raise Exception()
>>> bar()
Traceback (most recent call last):
...
Exception
>>> def foo_bar():
... foo()
... bar()
>>> foo_bar()
hello world!
Traceback (most recent call last):
...
Exception
Я ожидаю, что все три дела должны быть успешными, но только два из них, смотрите
$ python -m doctest -v /tmp/1.py
Trying:
def foo():
print 'hello world!'
Expecting nothing
ok
Trying:
foo()
Expecting:
hello world!
ok
Trying:
def bar():
raise Exception()
Expecting nothing
ok
Trying:
bar()
Expecting:
Traceback (most recent call last):
...
Exception
ok
Trying:
def foo_bar():
foo()
bar()
Expecting nothing
ok
Trying:
foo_bar()
Expecting:
hello world!
Traceback (most recent call last):
...
Exception
**********************************************************************
File "/tmp/1.py", line 16, in 1
Failed example:
foo_bar()
Exception raised:
Traceback (most recent call last):
File "/usr/lib/python2.7/doctest.py", line 1315, in __run
compileflags, 1) in test.globs
File "<doctest 1[5]>", line 1, in <module>
foo_bar()
File "<doctest 1[4]>", line 3, in foo_bar
bar()
File "<doctest 1[2]>", line 2, in bar
raise Exception()
Exception
**********************************************************************
1 items had failures:
1 of 6 in 1
6 tests in 1 items.
5 passed and 1 failed.
***Test Failed*** 1 failures.
1 ответ
Решение
Документы говорят, что вы не можете сделать это:
Примеры, содержащие как ожидаемый вывод, так и исключение, не поддерживаются. Попытка угадать, где заканчивается один и начинается другой, слишком подвержена ошибкам, и это также приводит к запутанному тесту.
Обычный вывод и трассировки нельзя смешивать, поскольку они представляют собой просто неразличимый текст. Однако вы можете обернуть блок, перехватив ожидаемое исключение:
>>> try:
... foo_bar()
... except TheSpecificExceptionYouWant:
... pass
... else:
... raise AssertionError('Should have raised an exception')
hello world!