【问题标题】:Monkey patch a python function - issueMonkey 修补 python 函数 - 问题
【发布时间】:2017-04-29 18:04:32
【问题描述】:

我无法用 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 语句所示,预期的结果是 'not ok',但结果是 'ok'。

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

其实如果我尝试这样调用ExampleClass中的函数

self.var_x = module_name.function_in_module()

工作正常。

我错过了什么?也许这是一种平庸,但它让我发疯了

提前谢谢你

【问题讨论】:

    标签: python python-2.7 unit-testing monkeypatching


    【解决方案1】:

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

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

    请注意,如果您使用 mock 库,您的生活会更轻松,尽管在哪里修补的问题仍然相同。

    【讨论】:

    • 相关,OP 也在调用有问题的函数并保存它的返回值,而不是保存函数本身。
    • 对不起@Daniel,你的意思是我应该像function_in_module = self.mp.monkey_function_in_module这样在def test_string中调用function_in_module还是我不明白?
    • 不,一点也不。你应该做module_that_defines_ExampleClass.function_in_module = ...。并注意 chepner 所说的话。
    猜你喜欢
    • 2016-02-15
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多