python - 尝试模拟模块时出现 ImportError

标签 python unit-testing mocking

我有一个正在测试的模块依赖于另一个在测试时不可用的模块。为了解决这个问题,我写了(基本上):

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

这是怎么回事?我可以在我的测试代码中做什么(不更改导入语句)来避免此错误?

最佳答案

好吧,我想我已经明白了。似乎在声明中:

from parent_module import unavailable_module

Python 寻找 parent_moduleattribute 称为 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/

相关文章:

python - 根据字符串长度动态打印

android - Robolectric ContentProvider 测试

unit-testing - 禁用 grails 命令对象中的验证约束以进行单元测试(使用 Spock)

typescript - 类型上不存在 Jest typescript 属性模拟

java - mockito 如何帮助减少测试用例

Python 单元测试 - if 语句中的模块未定义

python - 在 Pandas 中广播列表

python - 将 pandas 数据框中的一行分解为多行

python - 如何统计用户登录的次数?

swift - 快速灵活的变量始终为零