尝试模拟模块时的ImportError

时间:2013-01-31 21:50:07

标签: 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

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

1 个答案:

答案 0 :(得分:3)

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

from parent_module import unavailable_module

Python查找名为parent_module的{​​{1}}的属性。因此,以下设置代码完全取代unavailable_module中的unavailable_module

parent_module

我测试了我所知道的四种导入习语:

import mock
import sys

fake_module = mock.MagicMock()
sys.modules['parent_module.unavailable_module'] = fake_module
setattr(parent_module, 'unavailable_module', fake_module)

并且每个都使用上面的设置代码。