如何在Python 3.8+和Python 2.7+中使用unittest.mock包?

时间:2019-12-16 19:09:28

标签: python python-3.x python-2.7 python-unittest

我正在编写一个API客户端库。该库旨在支持Python 2.7+和Python 3 +。

现在编写测试并尝试使用MagicMockpatch。根据此处的文档https://cpython-test-docs.readthedocs.io/en/latest/library/unittest.mock.html,如果我安装unittest.mock(使用mock),则存在pip install mock==3.0.5的反向端口。但是,当我将其安装在docker映像中时,该行:

from unittest.mock import patch

仍然失败:

Traceback (most recent call last):
  File "/opt/conda/envs/py27/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/opt/conda/envs/py27/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/library_wq-api-utils/wq_api_utils/tests/tests.py", line 3, in <module>
    from unittest.mock import patch
ImportError: No module named mock

我可能对文档感到困惑,但是对使相同代码同时在python 2.7和3.8中运行的任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:2)

Python 2.x

使用此导入:

from mock import patch, MagicMock

Python 3.3 +

mock已包含在unittest模块中,可以通过以下方式导入:

from unittest.mock import patch, MagicMock

在运行时检查python版本

import sys
if sys.version_info[0] < 3:
    from mock import patch, MagicMock
if sys.version_info[0] > 3:
    from unittest.mock import patch, MagicMock

正在做什么

sys.version_info[0]是主要版本号,而sys.version_info[1]则是次要版本号。

python版本检查将检查它是python 2还是python 3

答案 1 :(得分:1)

一种可能的解决方案是使用try-except:

try:
    from unittest.mock import patch, MagicMock
except ImportError:
    from mock import patch, MagicMock

答案 2 :(得分:0)

我使用以下代码来防止全局名称空间污染:

import unittest
try:
    import unittest.mock
except ImportError:
    import mock
    unittest.mock = mock