我有一个正在测试的模块依赖于另一个在测试时不可用的模块。为了解决这个问题,我写了(基本上):
import mock
import sys
sys.modules['parent_module.unavailable_module'] = mock.MagicMock()
import module_under_test
只要 module_under_test
正在执行以下 import parent_module
、import parent_module.unavailable_module
之一,它就可以正常工作。但是,以下代码会生成回溯:
>>> from parent_module import unavailable_module
ImportError: cannot import name unavailable_module
这是怎么回事?我可以在我的测试代码中做什么(不更改导入语句)来避免此错误?
最佳答案
好吧,我想我已经明白了。似乎在声明中:
from parent_module import unavailable_module
Python 寻找 parent_module
的 attribute 称为 unavailable_module
。因此,以下设置代码完全替换了 parent_module
中的 unavailable_module
:
import mock
import sys
fake_module = mock.MagicMock()
sys.modules['parent_module.unavailable_module'] = fake_module
setattr(parent_module, 'unavailable_module', fake_module)
我测试了我所知道的四个导入习语:
import parent_module
import parent_module.unavailable_module
import parent_module.unavailable_module as unavailabe_module
from parent_module import unavailable_module
并且每个人都使用上面的设置代码。
关于python - 尝试模拟模块时出现 ImportError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14635791/