Monkey在模块中修补功能以进行单元测试

时间:2012-08-31 07:41:51

标签: python unit-testing monkeypatching

我在调用从另一个模块导入的另一个方法的模块中有以下方法:

def imported_function():
    do_unnecessary_things_for_unittest()

需要测试的实际方法,导入并使用上述功能:

from somewhere import imported_function

def function_to_be_tested():
    imported_function()
    do_something_more()
    return 42

imported_function 中的内部调用和相关计算并不重要,它们不是我想要测试的,所以我只想在测试实际函数时跳过它们 function_to_be_tested

因此,我试图在测试方法中修补名为某处的模块,但没有运气。

def test_function_to_be_tested(self):
    import somewhere
    somewhere.__dict__['imported_function'] = lambda : True

问题是,如何在测试时修补模块的方法,以便在测试阶段不会调用它?

2 个答案:

答案 0 :(得分:13)

我认为最好使用Mock Library

所以你可以这样做:

from somewhere import imported_function

@patch(imported_function)
def test_function_to_be_tested(self, imported_function):
    imported_function.return_value = True
    #Your test

我认为单元测试比猴子补丁好。

答案 1 :(得分:8)

假设您有以下文件:

<强> somewhere.py

def imported_function():
    return False

<强> testme.py

from somewhere import imported_function

def function_to_be_tested():
    return imported_function()

致电testme.function_to_be_tested()会返回False


现在,诀窍是在 somewhere之前导入testme

import somewhere
somewhere.__dict__['imported_function'] = lambda : True

import testme
def test_function_to_be_tested():
    print testme.function_to_be_tested()

test_function_to_be_tested()

<强>输出:

  


或者,重新加载testme模块

import testme

def test_function_to_be_tested():
    print testme.function_to_be_tested()
    import somewhere
    somewhere.__dict__['imported_function'] = lambda : True
    print testme.function_to_be_tested()
    reload(testme)
    print testme.function_to_be_tested()

test_function_to_be_tested()

<强>输出:

  


  假
  真