Python中如何模拟含UNSAFE_LEGACY_RENEGOTIATION_DISABLED的SSLError?
如何创建用于测试的Mock ssl.SSLError实例
你遇到的问题根源是ssl.SSLError的字符串表现依赖于初始化参数,而非直接设置reason属性。直接赋值reason不会让实例的字符串输出包含你需要的错误标识。
正确构造符合要求的SSLError实例
ssl.SSLError继承自OSError,它的初始化逻辑决定了实例的字符串格式,以下几种方法可以构造出能触发你异常判断的Mock实例:
方法1:模拟真实SSL错误的结构构造
真实的目标错误格式是[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled,可以通过传入错误码和对应描述元组来构造:
import ssl # 对应SSL错误类型的代码 err_code = ssl.SSL_ERROR_SSL # 元组第一个元素是错误标识,第二个是描述 err_details = ("UNSAFE_LEGACY_RENEGOTIATION_DISABLED", "unsafe legacy renegotiation disabled") mock_err = ssl.SSLError(err_code, err_details) print(str(mock_err)) # 输出:[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled
方法2:直接传入完整错误字符串
如果只需要让实例的字符串包含目标标识,也可以直接把完整错误信息传入构造函数:
import ssl mock_err = ssl.SSLError("[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled") print(str(mock_err)) # 输出:[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled
方法3:用unittest.mock模拟(适合单元测试场景)
在单元测试中,可以直接Mock实例的__str__方法,让它返回指定内容:
from unittest.mock import Mock import ssl mock_err = Mock(spec=ssl.SSLError) mock_err.__str__.return_value = "[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled" print(str(mock_err)) # 输出:[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled
用以上任意一种方式构造的实例,都能正常触发你异常处理代码中"UNSAFE_LEGACY_RENEGOTIATION_DISABLED" in str(ssl_err)的判断逻辑。
内容的提问来源于stack exchange,提问作者Woody1193
相关产品推荐
相关产品推荐

