如何在python中“导入一个真正的模块”时加载我的假模块?

时间:2013-11-28 08:10:27

标签: python python-module python-mock python-unittest

我需要在function.py上进行测试,在这个function.py中有一个import语句:

from my.functions import cleaner
from my.functions import worker

我不希望导入cleaner,因为它非常复杂。所以我尝试设置sys.path

sys.path.insert(0, './fakes')

fakes模块中,my.functions.cleaner也存在,但没有任何功能,但有效但会影响worker,我真的希望worker对我有效

所以我的问题是有什么方法可以将这种清洁剂“嘲笑”到我的假清洁剂上,每次进口清洁剂都需要我的假清洁剂替换它。

我尝试sys.modules但失败了。

2 个答案:

答案 0 :(得分:0)

如果您正在尝试动态替换函数,可以使用赋值语句I.E。来执行此操作:

要查看此操作,请查看此示例:

导入my.functions

/my

functions.py

def cleaner():
    print("Cleaner from functions!")

def worker():
    print("Worker from functions!")

base.py

import my.functions

def cleaner():
    print("Replacement fake cleaner!")

my.functions.cleaner = cleaner


def method_to_test():
    from my.functions import cleaner
    from my.functions import worker
    cleaner()
    worker()


if __name__ == "__main__":
    method_to_test()

Python将my.functions模块加载到sys.modules中,然后从导入中获取已加载模块中的对象,因此我们可以在函数导入之前设置模拟函数。

答案 1 :(得分:0)

你可以这样写unittest

 from mock import MagicMock
 import function

 function.cleaner = MagicMock()

 # test function's methods