Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python2.7中的模拟导入_Python_Python 2.7_Unit Testing - Fatal编程技术网

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
放在测试环境中。