Отключить настройку запуска носа ()

Пакет nose часто используется для запуска doctests, а также тесты в специальных тестовых файлах. Похоже, что даже в файлах doctest он пытается запустить фикстуры setup и teardown.

Когда модулю для тестирования документации требуется функция с именем setup для какой-то другой цели, это может быть расширение Sphinx, например: 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)

Запуск nosestests приводит к:

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 принимает аргумент, Nousetest проходит область, в которой setup является именем, в данном случае модулем.)

Обратите внимание, что следующее не (кажется) применимо:

  • добавление атрибута __test__ = False (или использование этот декоратор) на setup не останавливает его вызов.
  • нет параметра командной строки, эквивалентного --ignore-files
  • настройка my_tricky_function.setup = None не останавливает настройку на уровне модуля (h/t @alecxe)

person joeln    schedule 20.05.2014    source источник
comment
Просто выстрел в темноте - помогает ли настройка my_tricky_function.setup = None?   -  person alecxe    schedule 20.05.2014


Ответы (2)


Хотя собственный ответ joeln отличный, он немного загрязняет пространство имен модуля верхнего уровня.

Я бы проверил аргументы setup(), чтобы отличить вызов Nosetests от обычного вызова. В вашем случае, если app является модулем (или не имеет атрибута connect), просто вернитесь и ничего не делайте.

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

У меня была эта проблема, когда пользовательский setuptools.setup(**kwargs) споткнулся носом. В то время как Nosetests вызывает его без каких-либо аргументов, нормальное использование setup() всегда будет передавать некоторые аргументы ключевого слова, что позволяет мне различать два случая.

person llude    schedule 21.01.2016

Я нашел следующее несколько хакерское решение: добавить еще одну функцию setup_module, которая скроет setup из носа.

...

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

def setup_module():
    pass
person joeln    schedule 20.05.2014