尝试模拟模块时出现ImportError

4 投票
1 回答
1607 浏览
提问于 2025-04-17 14:22

我有一个模块正在测试,但它依赖的另一个模块在测试时无法使用。为了绕过这个问题,我写了(大致上是):

import mock
import sys

sys.modules['parent_module.unavailable_module'] = mock.MagicMock()
import module_under_test

只要module_under_test中有以下任意一个导入:import parent_moduleimport 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

而且每一种都能和上面的代码正常工作。

撰写回答