python - 如何在 Python 3.8+ 和 Python 2.7+ 中使用 unittest.mock 包?
问题描述
我正在编写一个 API 客户端库。该库旨在支持 Python 2.7+ 和 Python 3+。
现在编写测试并尝试使用MagicMock
and patch
。根据此处的文档https://cpython-test-docs.readthedocs.io/en/latest/library/unittest.mock.htmlunittest.mock
,如果我安装mock
(使用pip install mock==3.0.5
) ,则有一个 backport 。但是当我将它安装在我的 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]
是主要版本号,其中 assys.version_info[1]
将为您提供次要版本号。
python 版本检查将检查它是 python2
还是 python 3
。
推荐阅读
- php - 将多个提交按钮重定向到不同的页面
- java - 在java中调用类的get方法
- sql-server - 为 TOP 或 FETCH 子句行计数参数提供的行数必须是整数
- ios - 如何在Objective-C中像Twitter一样显示预览
- php - 您的系统中缺少请求的 PHP 扩展 ext-iconv *。安装或启用 PHP 的 iconv 扩展
- java - 错误:在 Eclipse 和命令提示符下编译时无法找到或加载主类错误但在 intelliJIDEA 中有效
- spring-boot - 在配置中定义servlet路径时如何在spring boot中提供静态内容
- django - Django - 如何在基于函数的视图中使用模型方法
- python - Python - 如果在线程中获取锁,该线程中的所有变量是否都被锁定?
- html - 防止 riotjs/typescript 中的 html 注释被转译