如何将函数与自身进行mock.patch



我正在尝试使用不同的参数将函数替换为它自己。

这是一个样品我不能分享真正的代码,我在纸上保密

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

注意:根据您的函数,您可能需要传递argskwargs_unpatched

最新更新