Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模拟模块的实现方法_Python_Mocking_Pytest - Fatal编程技术网

Python 模拟模块的实现方法

Python 模拟模块的实现方法,python,mocking,pytest,Python,Mocking,Pytest,我正在使用mock 1.0.1。我几乎找到了嘲弄一切的方法。这是一个强大的工具 我的所有配置都在一个名为algo_config的模块中 结构大致如下: --text ----algo_config 我试过了 with patch('text.algo_config') as Mockconfig: .... 但它给了我一个错误,说基本上文本模块没有属性algo_配置,似乎一个模块不能以这种方式模拟 有没有办法直接模拟模块,而不是逐个模拟模块的每个属性和函数、类?这里的核心问题是修补会

我正在使用mock 1.0.1。我几乎找到了嘲弄一切的方法。这是一个强大的工具

我的所有配置都在一个名为algo_config的模块中

结构大致如下:

--text
----algo_config
我试过了

with patch('text.algo_config') as Mockconfig:
    ....
但它给了我一个错误,说基本上文本模块没有属性algo_配置,似乎一个模块不能以这种方式模拟


有没有办法直接模拟模块,而不是逐个模拟模块的每个属性和函数、类?

这里的核心问题是修补会覆盖名称,而不是值。如果一个模块确实导入了text.algo_config,它现在有一个名为
text.algo_config
的本地名称,该名称指向该模块,但与其他模块中使用的名称完全无关。他们只是给他们起了相同的名字。(这就是为什么
导入foo-as-bar
有效的原因——它只是名称。)修补对该模块的另一个引用不会影响此引用

你有两个选择。要么修补模块引用,要么影响将来的导入

您最可能想要的解决方案是前者。您不修补模块,而是修补对您关心的模块的引用。例如,假设您正在测试
frobnitator.py
。该模块不通过文本导入算法配置执行
。然后,您可以将
与补丁('frobnitator.algo_config')一起用作algo_config
,这将影响
frobnitator
algo_config
的所有使用

或者,您也可以将模拟放入
sys.modules
,这将影响将来的
import
语句。也就是说,任何已经运行的导入语句都将导入旧值;并且在该补丁存在期间运行的任何导入语句都将导入模拟对象,但不会还原为实际模块。这是难以置信的变化无常,可能不是你想要的