【问题标题】:How can I set conditional decorators on setUpClass in unittest?如何在 unittest 中的 setUpClass 上设置条件装饰器?
【发布时间】:2013-01-23 08:20:13
【问题描述】:

我想在 python 的 unitest 中为setUpClass 设置一个条件装饰器。我已经尝试了以下方法(暂时没有条件,以证明这一点):

import unittest

class conditional_decorator(object):
    def __call__(self, func):
        print ("Extra output")
        return func

class First(unittest.TestCase):

    @classmethod
    @conditional_decorator
    def setUpClass(cls):
        print ("setting up")

    def test1(self):
        pass


if __name__ == '__main__':
    unittest.main()

但我得到一个错误

TypeError: object.__new__() takes no parameters

我该如何解决这个问题?此外,有没有一种简单的方法可以为setUpClass 方法“组合”两个装饰器?

【问题讨论】:

    标签: python unit-testing python-2.7 decorator class-method


    【解决方案1】:

    首先实例化您的 conditional_decorator 类:

    class First(unittest.TestCase):
    
        @classmethod
        @conditional_decorator() # Note the class is instantiated first.
        def setUpClass(cls):
        print ("setting up")
    
        def test1(self):
            pass
    

    或者使用函数而不是类作为装饰器:

    def conditional_decorator(func):
        print ("Extra output")
        return func
    
    class First(unittest.TestCase):
    
        @classmethod
        @conditional_decorator
        def setUpClass(cls):
            print ("setting up")
    
        def test1(self):
            pass
    
    
    if __name__ == '__main__':
        unittest.main()
    

    现在可以了:

    $ python my_test.py 
    Extra output
    setting up
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    
    OK
    

    【讨论】:

      【解决方案2】:

      当您查看回溯行时,它会告诉您错误发生的位置。我最好的猜测是,因为我不知道你的代码的其余部分,是在你的代码主体中你留下了一个额外的参数或添加了一个额外的逗号。

      至于提问的两位装饰师在这里提问:Can I combine two decorators into a single one in Python?

      *同时从 setUpClass 中删除 Class,因为 setUp 是它自己的函数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-21
        • 1970-01-01
        • 2019-03-03
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多