doctest异常输出未在pytest下报告

时间:2017-01-11 17:56:28

标签: python pytest

我在使用Pytest运行它们时遇到了doctest丢失的回溯。它的reversible state library以可逆的方式改变状态,例如代码:

import sys
from altered import state, forget
with state(sys.modules, shutil=forget):
    import shutil
#  Traceback output....

应该模拟导入问题并崩溃。如果我在项目根目录中将其作为脚本运行,我会得到一个追溯:

Traceback (most recent call last):
  ...traceback details...
KeyError: 'shutil'

另一方面,我有一个带有doctest格式示例的文档文件,其中包含以下示例:

>>> import sys
>>> from altered import state, forget
>>> with state(sys.modules, shutil=forget):
...     import shutil
Traceback (most recent call last):
    ...
KeyError: 'shutil'

如果我将示例文件作为doctested glob添加到pytest,pytest在运行时会抱怨:

$ py.test docs/examples.rst
============================ test session starts =============================
platform darwin -- Python 2.7.10, pytest-3.0.5, py-1.4.30, pluggy-0.4.0
rootdir: /Users/jacob/src/oss/altered.states, inifile: pytest.ini
collected 1 items

docs/examples.rst F

================================== FAILURES ==================================
[ ... parts of documentation /w doctest ... ]
053
054     >>> import sys
055     >>> from altered import state, forget
056     >>> with state(sys.modules, shutil=forget):
Expected:
    Traceback (most recent call last):
        ...
    KeyError: 'shutil'
Got nothing

这可能是pytest&#s; sdout捕获导致麻烦的?或者有人看到任何其他明显的故障排除入口点吗?

我曾尝试在我的doc文件的doctest示例中加入断点,但是步进使我进出pdb本身并且我无法使用该方法对问题有所了解。

1 个答案:

答案 0 :(得分:0)

...行动

我的不好:似乎我对模块导入的工作知之甚少!显然,从sys.modules中删除模块并不是阻止访问(未导入)模块的方法(参见例如Preventing Python code from importing certain modules?)。

很抱歉打扰你,虽然感谢有机会探索防止某些进口的正确方法!

将最顶层的代码更改为

import sys
from altered import state
with state(sys.modules, shutil=None):
    import shutil

使一切行为符合预期。

另请参阅this提交以获得额外的好奇心。