Подтвердить что ты не робот

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

У меня есть несколько относительно сложных тестов интеграции в моем коде 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 выполнить эти методы тестирования и обработать декоратор, как он предназначен?


Решение

Благодаря маджар, я получил эту работу, реструктурируя свой код, чтобы выглядеть так, используя functools.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
4b9b3361

Ответ 1

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

Легкий способ скопировать атрибуты функции в новую - использовать functools.wraps.