Нос игнорирует тест с помощью специального декоратора

У меня есть несколько относительно сложных интеграционных тестов в моем коде Python. Я значительно упростил их с помощью специального декоратора и очень доволен результатом. Вот простой пример того, как выглядит мой декоратор:

def specialTest(fn):

    def wrapTest(self):
        #do some some important stuff
        pass
    return wrapTest

Вот как может выглядеть тест:

class Test_special_stuff(unittest.TestCase):

    @specialTest
    def test_something_special(self):
        pass

Это прекрасно работает и без проблем выполняется тестировщиком PyCharm. Однако, когда я запускаю тест из командной строки с помощью Nose, он пропускает любой тест с декоратором @specialTest. Я попытался назвать декоратор как testSpecial, поэтому он соответствует правилам по умолчанию, но тогда мой параметр FN не передается.

Как я могу заставить Nose выполнять эти тестовые методы и обрабатывать декоратор так, как он задуман?


РЕШЕНИЕ

Благодаря madjar, я заработал, реструктурировав свой код, чтобы он выглядел так, используя functools.wraps и изменив имя оболочки:

from functools import wraps

def specialTest(fn):

    @wraps(fn)
    def test_wrapper(self,*args,**kwargs):
        #do some some important stuff
        pass
    return test_wrapper


class Test_special_stuff(unittest.TestCase):

    @specialTest
    def test_something_special(self):
        pass

person Corey Coogan    schedule 11.10.2011    source источник
comment
Обратите внимание, что нет необходимости переименовывать функцию-оболочку, если вы используете functools.wraps.   -  person Kos    schedule 02.01.2013
comment
неверно, если вы не ставите перед оберткой префикс test, нос пропускает тест, даже если вы используете обертки   -  person John Paraskevopoulos    schedule 03.12.2016


Ответы (1)


Если мне не изменяет память, нос загружает тест на основе их имен (функций, имя которых начинается с test_). В опубликованном вами фрагменте вы не копируете атрибут __name__ функции в свою функцию-оболочку, поэтому имя возвращаемой функции - wrapTest, и нос решает, что это не тест.

Простой способ скопировать атрибуты функции в новую — использовать functools.wraps< /а>.

person madjar    schedule 11.10.2011