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 に答える