我正在处理一个具有大量模块的代码库,这些模块可在导入数据库时实例化数据库连接,从注册表读取等。 (主函数或类中的代码,但在全局范围内)。我将这些模块称为“不良模块”。
出于这个问题范围之外的原因,我需要能够可靠地导入依赖于这些库的其他库(“好的模块”),并且我的环境使得这些库在导入时会失败。
此刻,我正在执行此操作,其中“ idmlib”是一个错误的模块,而其所有子级都是错误的模块:
sys.modules['idmlib'] = MagicMock()
sys.modules['idmlib.idmobject'] = Mock()
sys.modules['idmlib.idapi'] = Mock()
sys.modules['idmlib.database'] = Mock()
sys.modules['idmlib.plugins'] = Mock()
sys.modules['idmlib.plugins.authmod'] = Mock()
... other code ...
这很好用,但我需要预测idmlib
的每一个孩子,孙子等等,
相反,我想提前模拟idmlib
及其所有子模块,而无需知道所有这些子模块是什么。
有什么方法可以将sys.modules['idmlib']
变成其子模块也都是MagicMock
的MagicMock?
我的第一个想法是让sys.modules
是一个模拟原始sys.modules
的包装,如果要检查它是否以'idmlib'开头,或者与原始字典进行交互,它会具有其他行为
不幸的是,这会导致无限递归。
original_sys_modules = sys.modules
mock_sys_modules = MagicMock(wraps=original_sys_modules)
sys.modules = mock_sys_modules
import psutil
错误:
Traceback (most recent call last):
File "dryrun-script.py", line 26, in <module>
import psutil
File "C:\Users\danie01.AD\.virtualenvs\robotframework-O8sDx-L-\lib\site-packages\psutil\__init__.py", line 41, in <module>
from . import _common
File "C:\Users\danie01.AD\.virtualenvs\robotframework-O8sDx-L-\lib\site-packages\psutil\__init__.py", line 41, in <module>
from . import _common
File "C:\Users\danie01.AD\.virtualenvs\robotframework-O8sDx-L-\lib\site-packages\psutil\__init__.py", line 41, in <module>
from . import _common
File "C:\Users\danie01.AD\.virtualenvs\robotframework-O8sDx-L-\lib\site-packages\psutil\__init__.py", line 41, in <module>
from . import _common
File "C:\Users\danie01.AD\.virtualenvs\robotframework-O8sDx-L-\lib\site-packages\psutil\__init__.py", line 41, in <module>
from . import _common
File "C:\Users\danie01.AD\.virtualenvs\robotframework-O8sDx-L-\lib\site-packages\psutil\__init__.py", line 41, in <module>
from . import _common
File "C:\Users\danie01.AD\.virtualenvs\robotframework-O8sDx-L-\lib\site-packages\psutil\__init__.py", line 41, in <module>
from . import _common
File "C:\Users\danie01.AD\.virtualenvs\robotframework-O8sDx-L-\lib\site-packages\psutil\__init__.py", line 41, in <module>
from . import _common
...