模拟装饰器在被测方法上的返回值

时间:2018-02-20 11:21:00

标签: python monkeypatching

正如标题所说,我在尝试检查我的测试功能是否装饰了正确的装饰器时,我遇到了一些麻烦,其次是正确的参数。

正在测试的方法

@command_wrapper.command('string1', 'string2')
def function_under_test():
    return some_other_function();

单元测试

@patch("command_wrapper.command")
def test_function_under_test(self, mock_command_wrapper)
    * Do some testing *

装饰者:command_wrapper.py

def command(string1, string2):
    cmd_decorator(func):
        @wraps(func)
        def func_wrapper():
            * Do some code *
    return func_wrapper
return cmd_decorator

然而,当测试运行时,它清楚地执行装饰器而没有嘲笑它。我是Python的新手,所以我甚至不确定这是否可行,或者这是否是正确的方法。

1 个答案:

答案 0 :(得分:1)

装饰器在模块导入时运行,因此您需要在导入时对其进行修补。您可以通过强制重新加载模块来解决这个问题,解释here,并在未修补后再次恢复它。

e.g:

#python3.4+ only:
from importlib import reload
# python 3.X:
# from imp import reload
# python2 reload is built-in

import module_under_test

def test()
    try:
        with patch("command_wrapper.command") as mock_wrapper:
            # make decorator return function unchanged
            mock_wrapper.return_value.side_effect = lambda func: func
            reload(module_under_test)
            ** test stuff **
    finally:
        reload(module_under_test)

这有点hacky,可能更好地找到另一种测试方法,但我认为它会起作用。