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!
Другие вопросы по тегам