1

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

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

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

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

fakes模块中,amy.functions.cleaner也存在但没有功能,它有效但它也会影响worker,我真的想要我的worker作品。

所以我的问题是有什么方法可以将这种清洁剂“模拟”成我的假清洁剂,我每次进口清洁剂时都需要我的假清洁剂更换它。

我试过sys.modules但失败了。

4

2 回答 2

0

如果您尝试动态替换函数,可以使用赋值语句 IE 来执行此操作:

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

导入 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 中,然后在后续 from 导入中从已加载的模块中获取对象,因此我们可以在您的函数导入之前设置一个模拟函数。

于 2013-11-28T08:14:27.847 回答
0

你可以unittest这样写:

 from mock import MagicMock
 import function

 function.cleaner = MagicMock()

 # test function's methods
于 2013-11-28T08:14:37.350 回答