Monkey 补丁 python 函数 - 问题
Monkey patch a python function - issue
我无法用 TestClass
替换来自不同模块的 python 函数
我正在尝试测试我的代码中包含模块中函数的部分;更多细节我想要猴子补丁这个功能。
所以,情况类似下面:
模块中的函数
def function_in_module():
# do some stuff
return 'ok'
我想测试的部分代码
from dir_1.dir_2.dir_3.module_name import function_in_module
class ExampleClass():
def __init__(self):
# do some stuff
self.var_x = function_in_module()
# do some stuff again
测试class
from dir_1.dir_2.dir_3 import module_name
class TestClass(TestCase):
de_monkey = {}
mp = None
def setUp(self):
# save original one
self.de_monkey['function_in_module'] = module_name.function_in_module()
if self.mp is None:
self.mp = MP()
def tearDown(self):
# rollback at the end
module_name.function_in_module = self.de_monkey['function_in_module']
def test_string(self):
module_name.function_in_module = self.mp.monkey_function_in_module
test_obj = ExampleClass()
self.assertEqual(test_obj.var_x, 'not ok')
class MP(object):
@staticmethod
def monkey_function_in_module(self):
return 'not ok'
如断言语句所示,预期结果为'not ok',但结果为'ok'。
我已经对此进行了调试,似乎调用函数的方式不同是因为这个猴子补丁不起作用。
事实上,如果我尝试以这种方式调用 ExampleClass 中的函数
self.var_x = module_name.function_in_module()
工作正常。
我错过了什么?也许这是陈词滥调,但它让我发疯
提前致谢
您的测试代码导入 function_in_module
并直接引用它。更改 module_name.function_in_module
的值对代码没有影响。
您应该直接在包含被测代码的模块中替换函数,而不是在源模块中。
请注意,如果您使用 mock
库,您的生活会更轻松,尽管在哪里打补丁的问题仍然相同。
我无法用 TestClass
替换来自不同模块的 python 函数我正在尝试测试我的代码中包含模块中函数的部分;更多细节我想要猴子补丁这个功能。
所以,情况类似下面:
模块中的函数
def function_in_module():
# do some stuff
return 'ok'
我想测试的部分代码
from dir_1.dir_2.dir_3.module_name import function_in_module
class ExampleClass():
def __init__(self):
# do some stuff
self.var_x = function_in_module()
# do some stuff again
测试class
from dir_1.dir_2.dir_3 import module_name
class TestClass(TestCase):
de_monkey = {}
mp = None
def setUp(self):
# save original one
self.de_monkey['function_in_module'] = module_name.function_in_module()
if self.mp is None:
self.mp = MP()
def tearDown(self):
# rollback at the end
module_name.function_in_module = self.de_monkey['function_in_module']
def test_string(self):
module_name.function_in_module = self.mp.monkey_function_in_module
test_obj = ExampleClass()
self.assertEqual(test_obj.var_x, 'not ok')
class MP(object):
@staticmethod
def monkey_function_in_module(self):
return 'not ok'
如断言语句所示,预期结果为'not ok',但结果为'ok'。
我已经对此进行了调试,似乎调用函数的方式不同是因为这个猴子补丁不起作用。
事实上,如果我尝试以这种方式调用 ExampleClass 中的函数
self.var_x = module_name.function_in_module()
工作正常。
我错过了什么?也许这是陈词滥调,但它让我发疯
提前致谢
您的测试代码导入 function_in_module
并直接引用它。更改 module_name.function_in_module
的值对代码没有影响。
您应该直接在包含被测代码的模块中替换函数,而不是在源模块中。
请注意,如果您使用 mock
库,您的生活会更轻松,尽管在哪里打补丁的问题仍然相同。