【问题标题】:mock import in Python 2.7Python 2.7 中的模拟导入
【发布时间】:2020-06-11 16:03:40
【问题描述】:

我有一个格式的导入:

from a.b.c.d import x

在 foo.py 中。我正在测试 bla.py,它不会直接导入 foo.py,而是通过其中一种方法间接导入。类似的东西:

bla.m1() --> bla2.m2() --> foo.m3()

在我的测试环境中,包“a”不可用,我想模拟它,以便在测试期间导入不会失败。根据How to mock an import,我可以使用:

import sys
from unittest.mock import Mock
sys.modules['a.b.c.d'] = Mock()

如果我使用的是 Python 3,则导入在测试代码中有效,但在我使用 Python 2.7(和外部模拟库)时它会失败。为什么?如何让它在 Python 2.7 中工作?

【问题讨论】:

  • 似乎正确的解决方法是在您的测试环境中放置a

标签: python python-2.7 unit-testing


【解决方案1】:

对于 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)

<Mock name='mock.d' id='140035843407120'>

但以下内容也是完全有效的:

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)

<Mock name='mock.d' id='1402443407120'>

【讨论】:

    猜你喜欢
    • 2015-04-04
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多