我正在尝试使用不同的参数将函数替换为它自己。
这是一个样品我不能分享真正的代码,我在纸上保密
import unittest
from unittest.mock import patch
import mymodule
import production
class MyTest(unittest.TestCase):
@patch('production.mymodule.myfunction', lambda: mymodule.myfunction(devmode=True))
def test_main_with_mymodule_function_does_not_raise_exception(self):
# This is an integration test. myfunction is used within main.
try:
production.main()
except Exception as e:
self.fail(e)
正如预期的那样,以下生成递归调用:
@patch('production_code.mymodule.myfunction', lambda: mymodule.myfunction(devmode=True))
我们基本上用一个将调用myfunction
的装饰器来装饰myfunction
。我们得到了一个很好的";重复出现次数太多"例外
我需要一种用myfunction(devmode=True)
替换myfunction(devmode=False)
的方法。但由于我正在进行集成测试,并且正在测试main()
,所以我无法直接访问函数的参数。问题是,我做了这个集成测试来测试myfunction是如何与其他所有东西集成的。
理想情况下,我甚至不应该创建devmode
参数,但我正在运行一个繁重的sql查询,需要通过向查询中添加"TOP(10)"
来限制它。
谢谢你的帮助!:(
您可以在测试运行之前保留对未修补函数的引用。在补丁调用中使用:
import unittest
from unittest.mock import patch
def iut(devmode=False):
print(devmode)
class MyTest(unittest.TestCase):
_unpatched = iut # keep reference to unpatched IUT
@patch('so_test.iut', lambda *args, **kwargs: MyTest._unpatched(devmode=True))
def test(self):
try:
iut()
except Exception as e:
self.fail(e)
结果如下,表明devmode
设置为True:
True
注意:根据您的函数,您可能需要传递args
、kwargs
到_unpatched
。