我需要在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
但失败了。
答案 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