我正在使用模拟1.0.1。我几乎找到了模拟一切的方法。这是一个强大的工具。
我所有的配置都在一个名为algo_config的模块中。
结构大致如下:
--text
----algo_config
我试过了
with patch('text.algo_config') as Mockconfig:
....
但这给了我一个错误,说基本上文本模块没有属性algo_config,似乎无法以这种方式模拟模块。
有什么方法可以直接模拟一个模块,而不是一个个地模拟每个属性和函数,类?
问题的核心在于,修补程序会覆盖名称,而不是值。如果有一个模块import text.algo_config
,则它现在有一个本地名称text.algo_config
,该名称指向该模块,但与其他模块中使用的名称完全无关。他们只是命名相同。(这就是import foo as bar
起作用的原因–仅仅是名称。)修补对该模块的另一个引用不会影响此引用。
您有两个选择。修补模块引用,或者影响将来的导入。
您最可能需要的解决方案是前者。您没有修补模块,而是参考了您关心的模块。例如,假设您正在测试frobnicator.py
。该模块可以from text import algo_config
。然后,您可以使用with patch('frobnicator.algo_config') as algo_config
,这将影响到所有使用algo_config
中frobnicator
。
另外,您也可以将放入sys.modules
,这会影响以后的 import
语句。也就是说,任何已经运行的import语句都将导入旧值。并且在此修补程序存在期间运行的任何import语句都将导入模拟对象,但不会还原为实际模块。这是难以置信的善变,可能不是您想要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句