python - 禁用 Nose 运行设置()

标签 python python-sphinx nose doctest

nose包通常用于运行 doctests以及专用测试文件中的测试。似乎即使在 doctest 文件中,它也会尝试运行 setupteardown fixture。

当用于文档测试的模块碰巧需要一个名为 setup 的函数用于其他目的——它可能是一个 Sphinx extension ,例如——nosetests 将调用 setup 并失败。

为了清楚起见,这里有一个例子:

def my_tricky_function(arg):
    """Do something testable

    >>> my_tricky_function(1)
    2
    """
    return arg + arg


def my_extension(app):
    ...


def setup(app):
    """Establish sphinx hooks"""
    app.connect('build-finished', my_extension)

运行 nosetests 结果:

File ".../site-packages/nose/suite.py", line 291, in setUp
    self.setupContext(ancestor)
  File ".../site-packages/nose/suite.py", line 314, in setupContext
    try_run(context, names)
  File ".../site-packages/nose/util.py", line 468, in try_run
    return func(obj)
  File "sphinx_ext.py", line 14, in setup
    app.connect('build-finished', my_extension)
AttributeError: 'module' object has no attribute 'connect'

(注意:当 setup 接受参数时,nosetest 传递 setup 是名称的范围,在本例中是模块。)

请注意以下内容不(似乎)适用:

  • 添加属性 __test__ = False (或使用 this decorator )setup 不会阻止它被调用。
  • 没有等同于--ignore-files 的命令行选项
  • 设置 my_tricky_function.setup = None 不会停止模块级设置 (h/t @alecxe)

最佳答案

虽然 joeln 自己的回答很漂亮,但它确实有点污染了模块的顶级命名空间。

我会检查 setup() 的参数以区分 nosetests 调用和普通调用。在您的情况下,如果 app 是一个模块(或没有 connect 属性),只需返回而不执行任何操作。

def setup(app):
    """Establish sphinx hooks"""
    if hasattr(app, 'connect'):
        app.connect('build-finished', my_extension)

我遇到了一个自定义 setuptools.setup(**kwargs) 绊倒 Nose 的问题。虽然 nosetests 在没有任何参数的情况下调用它,但 setup() 的正常使用总是会传入一些关键字参数,这使我能够区分这两种情况。

关于python - 禁用 Nose 运行设置(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23749154/

相关文章:

python - 从 pypi 安装 Pip 有效,但从 testpypi 失败(找不到要求)

任意行上的 Python Sphinx anchor

python-sphinx - csv 表格式通过序言?

python - 如何防止 Nose 运行和报告重复的测试?

python - 如何在 PyCharm 中禁用 -u 解释器选项?

python - 与 gridspec 子图共享轴

python - 自定义格式的 Django 表单错误出现两次

python - 使用 django 将文本加粗

python - 强制 Sphinx 在 Python 文档字符串中解释 Markdown 而不是 reStructuredText

python - 让 Nose 无法通过慢速测试