11

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

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人删除它,并且它没有被遗忘?

4

2 回答 2

5

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

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

assert (my_method.__closure__ and 
           my_method.__closure__[0].cell_contents.__name__ == my_method.__name__)
于 2012-04-04T14:01:35.777 回答
3

您可以通过依赖装饰器使用属性标记包装函数来做到这一点,然后断言。

一个好的做法是让装饰器设置一个__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'
于 2012-04-04T13:54:23.197 回答