尝试模拟模块时出现ImportError
我有一个模块正在测试,但它依赖的另一个模块在测试时无法使用。为了绕过这个问题,我写了(大致上是):
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
这是怎么回事呢?我在测试代码中可以做些什么(不改变导入语句)来避免这个错误呢?
1 个回答
3
好的,我想我明白了。在这段代码中:
from parent_module import unavailable_module
Python会去查找一个叫做 unavailable_module
的属性,它是在 parent_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
而且每一种都能和上面的代码正常工作。