如何声明一个方法是用python unittest装饰的?

时间:2012-04-04 13:30:52

标签: python unit-testing unittest2

我有一个装饰器,我想断言我的代码中的某些方法是用它装饰的。

import functools

def decorator(func):
    def _check_something(*args, **kwargs):
        # some logic in here
        return func(*args, **kwargs)
    return functools.wraps(func)(_check_something)

class MyClass(object):

    @decorator
    def my_method(foo, bar):
        pass

我如何断言unittest(unitttest2)my_method@decorator并且没有人删除它,并且没有忘记?

2 个答案:

答案 0 :(得分:4)

如果由于某种原因您无法修改装饰器,您还可以尝试检查闭合变量的某些特征。

在您的示例中,您知道原始my_method是装饰器关闭的唯一变量,因此您可以:

assert (my_method.__closure__ and 
           my_method.__closure__[0].cell_contents.__name__ == my_method.__name__)

答案 1 :(得分:2)

你可以依靠装饰器用一个属性来标记包装函数,然后断言。

一个好的做法是让装饰器设置一个__wrapped__属性指向返回的包装器上的原始函数。

因此:

def decorator(func):
    @functools.wraps(func)
    def _check_something(*args, **kwargs):
        # some logic in here
        return func(*args, **kwargs)
    _check_something.__wrapped__ = func   # <== add this
    return _check_something

然后,在您的测试代码上:

assert getattr(MyClass.my_method, "__wrapped__").__name__ == 'my_method'