python - 如何使用装饰器修补 sys 属性?
问题描述
我有一个取决于 Python 版本的函数。我想通过模拟sys.version
信息在单元测试中对此进行测试。以下代码有效:
def test_python_version(self):
with patch("sys.version_info", [3]):
my_func()
with patch("sys.version_info", [2]):
my_func()
我想使用装饰器,但以下代码不起作用。为什么是这样?如何设置传递给我的测试的 MagicMock 对象的值?谢谢
@patch("sys.version_info")
def test_python_version(self, mock_version_info):
mock_version_info.return_value = [3]
my_func()
mock_version_info.return_value = [2]
my_func()
尝试做TypeError: '<' not supported between instances of 'MagicMock' and 'int'
时失败。my_func
if sys.version_info[0] < 3
解决方案
编辑:
是的,它有效。原始函数返回一个带有major
,minor
和micro
字段的命名元组。您可以通过构建自己的命名元组来模仿它。当您使用int
索引访问时,我只是使用一个简单的元组。您的代码的问题在于您索引的方式[0]
不正确。
编辑2:
正如 Zaur Nasibov 指出的那样,sys.version_info
它不是一个函数,因此尽管在模拟中看起来不错(正如 GenError 也发现的那样),但我的代码是错误的。我做了一些改动来修复它(请参阅 GenError 答案以获取替代方法PropertyMock
)
import sys
from unittest.mock import patch
def my_func():
version = sys.version_info # removed the ()
print('Detected version:', version)
if version[0] < 3:
print('Error: Python 3 required.')
@patch('__main__.sys')
def test_python_version(mock_sys):
mock_sys.version_info = (3,6,2)
my_func()
print()
mock_sys.version_info = (2,7,0)
my_func()
test_python_version()
输出
Detected version: (3, 6, 2)
Detected version: (2, 7, 0)
Error: Python 3 required.
推荐阅读
- linux-kernel - ftrace:通过GPIO输出
- javascript - 如何使用 ffmpeg 通过媒体记录器 api 从块中创建视频文件 webm
- c# - 在 c# 中通过 : 拆分字符串,但忽略 :: 和任何括号
- java - Hibernate 读取和更新大数据
- amazon-web-services - Beanstalk 升级到“运行 Tomcat 8.5 Corretto 8 的 64 位 Amazon Linux 2 v4.1.2”后缺少 Tomcat 日志 (catalina.out)
- c - C用分隔符加入char**
- node.js - findOneAndUpdate 未在环回中返回新文档
- swift - 在 API 函数调用之后 SWIFT 设置 UI 值
- java - 尝试在空对象引用上调用虚拟方法 'boolean java.lang.String.equals(java.lang.Object)' 请帮助我解决此错误
- reactjs - AWS Amplify s3 图像选择器状态检查成功在反应 js 中上传图像后