如何为Telethon单元测试生成可正常实例化的Fake StringSession
生成Telethon StringSession假值用于单元测试
问题说明
你在单元测试中尝试用假字符串实例化StringSession时触发了格式校验错误,报错信息翻译如下:
self = <telethon.sessions.string.StringSession object at 0x7f0777492ad0> string = 'dummyxxx' def __init__(self, string: str = None): super().__init__() if string: if string[0] != CURRENT_VERSION: raise ValueError('不是有效的字符串') string = string[1:] ip_len = 4 if len(string) == 352 else 16 > self._dc_id, ip, self._port, key = struct.unpack( _STRUCT_PREFORMAT.format(ip_len), StringSession.decode(string)) E struct.error: 解包需要275字节的缓冲区
原因是StringSession的构造函数会严格校验字符串格式:首字符必须匹配当前版本标识,后续内容解码后的数据长度要满足结构体解包要求,随便填写的字符串无法通过校验。
解决方案
方法1:生成合法的空会话字符串
直接利用Telethon自身的API生成一个合法的空会话字符串,既符合格式要求,又不会包含真实会话数据:
from telethon.sessions.string import StringSession # 创建空会话实例并导出字符串 fake_session = StringSession() fake_session_value = fake_session.save() # 用生成的假值实例化StringSession test_session = StringSession(fake_session_value)
方法2:Mock StringSession(更轻量的单元测试方案)
如果单元测试不需要依赖StringSession的真实内部逻辑,直接Mock该类即可,完全避开格式校验:
from unittest.mock import Mock from telethon.sessions.string import StringSession from telethon import TelegramClient # Mock StringSession实例 mock_session = Mock(spec=StringSession) # 传入Mock的TelegramClient mock_client = Mock(spec=TelegramClient, session=mock_session)
方法3:手动构造格式合法的假字符串(不推荐)
如果你需要手动构造,首先确认当前版本标识(Telethon源码中CURRENT_VERSION通常为'A'),然后填充符合长度的base64编码内容。但这种方法依赖Telethon内部实现细节,版本更新后可能失效,因此优先推荐前两种方法。
内容的提问来源于stack exchange,提问作者digitalronin
相关产品推荐
相关产品推荐

