Python 模拟模块的实现方法
我正在使用mock 1.0.1。我几乎找到了嘲弄一切的方法。这是一个强大的工具 我的所有配置都在一个名为algo_config的模块中 结构大致如下:Python 模拟模块的实现方法,python,mocking,pytest,Python,Mocking,Pytest,我正在使用mock 1.0.1。我几乎找到了嘲弄一切的方法。这是一个强大的工具 我的所有配置都在一个名为algo_config的模块中 结构大致如下: --text ----algo_config 我试过了 with patch('text.algo_config') as Mockconfig: .... 但它给了我一个错误,说基本上文本模块没有属性algo_配置,似乎一个模块不能以这种方式模拟 有没有办法直接模拟模块,而不是逐个模拟模块的每个属性和函数、类?这里的核心问题是修补会
--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
语句。也就是说,任何已经运行的导入语句都将导入旧值;并且在该补丁存在期间运行的任何导入语句都将导入模拟对象,但不会还原为实际模块。这是难以置信的变化无常,可能不是你想要的