在测试用例中,我想模拟
keras
包,我不知道用户将如何导入该包。这意味着我需要支持
import keras
from keras import something
from keras.backend import otherthings
from keras.sub.subsub....module import somethingelse
我尝试使用
Mock
对象执行以下操作:
from unittest.mock import Mock
m = Mock()
sys.modules['keras'] = m
import keras # Success
from keras import backend # Success
from keras.backend import a # Failed: ModuleNotFoundError: No module named 'keras.backend'; 'keras' is not a package
我当然可以添加一行像
sys.modules['keras.backend'] = m
要绕过此错误,但我不知道用户明天是否需要另一个模块 - 我只需添加模块列表,这似乎不是一个好的选择。
有什么方法可以让我递归地模拟这个模块吗?
函数,如果给定名称以
'keras'
开头,则返回模拟对象:import builtins
from unittest.mock import Mock
def mock_keras(name, *args, mocks={}, orig_import=__import__, **kwargs):
if name.split('.')[0] == 'keras':
return mocks.setdefault(name, Mock(name=name))
return orig_import(name, *args, **kwargs)
builtins.__import__ = mock_keras
import keras
from keras.foo import bar
print(keras)
print(bar)
输出:
<Mock name='keras' id='22749078475248'>
<Mock name='keras.foo.bar' id='22749077888256'>
演示:https://ideone.com/SPC0mh