You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:50:21