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 库,您的生活会更轻松,尽管在哪里打补丁的问题仍然相同。