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

Evg*_*eny 10 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
Run Code Online (Sandbox Code Playgroud)

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

agf*_*agf 5

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

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

assert (my_method.__closure__ and 
           my_method.__closure__[0].cell_contents.__name__ == my_method.__name__)
Run Code Online (Sandbox Code Playgroud)


jsb*_*eno 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
Run Code Online (Sandbox Code Playgroud)

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

assert getattr(MyClass.my_method, "__wrapped__").__name__ == 'my_method'
Run Code Online (Sandbox Code Playgroud)

  • 这将检查 *some* 装饰器是否存在,但不一定是特定的“装饰器”函数。有没有办法测试_特定_装饰器的存在? (7认同)