Python2.7中的模拟导入
我有以下格式的导入:Python2.7中的模拟导入,python,python-2.7,unit-testing,Python,Python 2.7,Unit Testing,我有以下格式的导入: from a.b.c.d import x 在foo.py。我正在测试bla.py,它不直接导入foo.py,而是通过其方法之一间接导入foo.py。比如: bla.m1()-->bla2.m2()-->foo.m3() 在我的测试环境中,包“a”不可用,我想模拟它,以便在测试期间导入不会失败。据我所知,我可以使用: import sys from unittest.mock import Mock sys.modules['a.b.c.d'] = Mock() 如果我
from a.b.c.d import x
在foo.py。我正在测试bla.py,它不直接导入foo.py,而是通过其方法之一间接导入foo.py。比如:
bla.m1()-->bla2.m2()-->foo.m3()
在我的测试环境中,包“a”不可用,我想模拟它,以便在测试期间导入不会失败。据我所知,我可以使用:
import sys
from unittest.mock import Mock
sys.modules['a.b.c.d'] = Mock()
如果我使用的是Python3,那么导入可以在测试代码中工作,但是当我使用Python2.7(以及外部模拟库)时导入失败。为什么?如何使其在Python 2.7中工作?对于Python 2.7,您需要显式地将模拟模块的每个级别创建为“真实”的内容,因为Python会检查对象是否存在(即使它实际上没有对其做任何操作) 最简单的选择是也使它们成为
Mock
方法,以防您想要测试它们:
import sys
from mock import Mock
sys.modules['a'] = Mock()
sys.modules['a.b'] = Mock()
sys.modules['a.b.c'] = Mock()
from a.b.c import d
print(d)
但是,以下内容也完全有效:
import sys
from mock import Mock
sys.modules['a'] = 'cat'
sys.modules['a.b'] = 1
sys.modules['a.b.c'] = Mock()
from a.b.c import d
print(d)
似乎正确的修复方法是将包
a
放在测试环境中。