在被测方法上模拟 return 装饰器的值
Mock return value of decorator on method under test
正如标题所说,我在尝试检查我的被测函数是否使用正确的装饰器进行装饰时遇到了一些麻烦,其次是正确的参数。
正在测试的方法
@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 的新手,所以我什至不确定这是否可行,或者这是否是正确的方法。
装饰器在模块导入时是 运行,因此您需要在导入时对其进行修补。您可以通过强制重新加载模块来执行此操作,here 解释道,并在未打补丁后再次将其还原。
例如:
#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,可能最好找到另一种方法来测试,但我认为它会起作用。
正如标题所说,我在尝试检查我的被测函数是否使用正确的装饰器进行装饰时遇到了一些麻烦,其次是正确的参数。
正在测试的方法
@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 的新手,所以我什至不确定这是否可行,或者这是否是正确的方法。
装饰器在模块导入时是 运行,因此您需要在导入时对其进行修补。您可以通过强制重新加载模块来执行此操作,here 解释道,并在未打补丁后再次将其还原。
例如:
#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,可能最好找到另一种方法来测试,但我认为它会起作用。