如何在 Python 3.8+ 和 Python 2.7+ 中使用 unittest.mock 包?
How to use unittest.mock package in both Python 3.8+ and Python 2.7+?
我正在编写一个 API 客户端库。该库旨在支持 Python 2.7+ 和 Python 3+。
现在编写测试并尝试使用 MagicMock
和 patch
。根据此处的文档 https://cpython-test-docs.readthedocs.io/en/latest/library/unittest.mock.html,如果我安装 mock
(使用 pip install mock==3.0.5
),则有 unittest.mock
的向后移植。但是当我将它安装在我的 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 中编写相同的代码 运行,我们将不胜感激。谢谢!
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
.
一个可能的解决方案是使用 try-except:
try:
from unittest.mock import patch, MagicMock
except ImportError:
from mock import patch, MagicMock
我使用以下代码来防止全局命名空间污染:
import unittest
try:
import unittest.mock
except ImportError:
import mock
unittest.mock = mock
我正在编写一个 API 客户端库。该库旨在支持 Python 2.7+ 和 Python 3+。
现在编写测试并尝试使用 MagicMock
和 patch
。根据此处的文档 https://cpython-test-docs.readthedocs.io/en/latest/library/unittest.mock.html,如果我安装 mock
(使用 pip install mock==3.0.5
),则有 unittest.mock
的向后移植。但是当我将它安装在我的 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 中编写相同的代码 运行,我们将不胜感激。谢谢!
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
.
一个可能的解决方案是使用 try-except:
try:
from unittest.mock import patch, MagicMock
except ImportError:
from mock import patch, MagicMock
我使用以下代码来防止全局命名空间污染:
import unittest
try:
import unittest.mock
except ImportError:
import mock
unittest.mock = mock