我有一个装饰器,我想断言我的代码中的某些方法是用它装饰的。
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
并且没有人删除它,并且没有忘记?
答案 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'