模拟从...导入中幸存下来的包

问题描述 投票:0回答:1

在测试用例中,我想模拟

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

要绕过此错误,但我不知道用户明天是否需要另一个模块 - 我只需添加模块列表,这似乎不是一个好的选择。

有什么方法可以让我递归地模拟这个模块吗?

python unit-testing mocking
1个回答
0
投票

__import__

 函数,如果给定名称以 
'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

© www.soinside.com 2019 - 2024. All rights reserved.