鼻子忽略了自定义装饰器的测试

Cor*_*gan 25 python ignore decorator nose

我的Python代码中有一些相对复杂的集成测试.我用自定义装饰器大大简化了它们,我对结果非常满意.这是我的装饰器看起来像一个简单的例子:

def specialTest(fn):

    def wrapTest(self):
        #do some some important stuff
        pass
    return wrapTest
Run Code Online (Sandbox Code Playgroud)

这是测试的样子:

class Test_special_stuff(unittest.TestCase):

    @specialTest
    def test_something_special(self):
        pass
Run Code Online (Sandbox Code Playgroud)

这很好用,并且由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
Run Code Online (Sandbox Code Playgroud)

mad*_*jar 24

如果我没记错的话,鼻子根据他们的名字(名称以test_开头的函数)加载测试.在您发布的代码片段中,您不会__name__在包装函数中复制函数的属性,因此返回的函数的名称wrapTest和nose决定它不是测试.

将使用将函数的属性复制到新函数的简单方法functools.wraps.