在 python 中模拟子模块
Mocking submodules in python
我正在尝试通过 sphinx 为我的项目生成自动文档。但是,我将 运行 在没有我正在导入的所有模块的环境中生成自动文档。因此我想模拟导入语句。
在 http://read-the-docs.readthedocs.io/en/latest/faq.html 我发现了这个 C 模块的技巧:
import sys
from unittest.mock import MagicMock
class Mock(MagicMock):
@classmethod
def __getattr__(cls, name):
return Mock()
MOCK_MODULES = ['pygtk', 'gtk', 'gobject', 'argparse', 'numpy', 'pandas']
sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)
然而模拟 getattr 并不能解决像这样的情况:
from foo.bar import blah
也就是当import语句中涉及到一个点[.]的时候。
有人知道如何为特定的模块列表模拟我的所有导入吗?
导入
from foo.bar import blah
将寻找 sys.modules['foo.bar']
。只需插入:
>>> from foo.bar import blah
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'foo'
>>> import sys
>>> from unittest import mock
>>> sys.modules['foo.bar'] = mock.Mock()
>>> from foo.bar import blah
>>> blah
<Mock name='mock.blah' id='4362289896'>
我正在尝试通过 sphinx 为我的项目生成自动文档。但是,我将 运行 在没有我正在导入的所有模块的环境中生成自动文档。因此我想模拟导入语句。
在 http://read-the-docs.readthedocs.io/en/latest/faq.html 我发现了这个 C 模块的技巧:
import sys
from unittest.mock import MagicMock
class Mock(MagicMock):
@classmethod
def __getattr__(cls, name):
return Mock()
MOCK_MODULES = ['pygtk', 'gtk', 'gobject', 'argparse', 'numpy', 'pandas']
sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)
然而模拟 getattr 并不能解决像这样的情况:
from foo.bar import blah
也就是当import语句中涉及到一个点[.]的时候。
有人知道如何为特定的模块列表模拟我的所有导入吗?
导入
from foo.bar import blah
将寻找 sys.modules['foo.bar']
。只需插入:
>>> from foo.bar import blah
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'foo'
>>> import sys
>>> from unittest import mock
>>> sys.modules['foo.bar'] = mock.Mock()
>>> from foo.bar import blah
>>> blah
<Mock name='mock.blah' id='4362289896'>