繁体   English   中英

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

测试班

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'

如assert语句所示,预期结果为“不正常”,但结果为“正常”。

我对此进行了调试,并且似乎以不同的方式调用函数是因为此猴子补丁不起作用的原因。

实际上,如果我尝试以这种方式在ExampleClass中调用该函数

self.var_x = module_name.function_in_module()

正常工作。

我想念什么? 也许是平淡无奇,但这却使我发疯

先感谢您

被测代码将导入function_in_module并直接引用它。 更改module_name.function_in_module的值对代码没有影响。

您应该直接在包含被测代码的模块中而不是在源模块中替换该功能。

请注意,如果使用mock库,尽管在何处打补丁的问题仍然相同,但生活会更轻松。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM