导入前模拟模块和所有子模块

时间:2019-03-26 23:41:35

标签: python mocking python-unittest

我正在处理一个具有大量模块的代码库,这些模块可在导入数据库时​​实例化数据库连接,从注册表读取等。 (主函数或类中的代码,但在全局范围内)。我将这些模块称为“不良模块”。

出于这个问题范围之外的原因,我需要能够可靠地导入依赖于这些库的其他库(“好的模块”),并且我的环境使得这些库在导入时会失败。

此刻,我正在执行此操作,其中“ 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
    ...

0 个答案:

没有答案