如何用python-telegram-bot将telegram.User加入telegram.Chat以构建测试
测试场景下向模拟Chat对象添加User的实现方案
ptb 库的 Chat 实例本身没有内置 add_user 方法,该操作对应生产环境的 addChatMember 后端API调用,你明确需求为测试场景的话,可以按以下几种方式实现:
方式1:手动为Chat实例追加成员存储属性
测试场景无需对齐生产API的对象结构,直接给创建好的chat对象加成员列表字段即可满足逻辑校验需求:from telegram import User, Chat # 原有对象创建逻辑 user = User(id=123, first_name="Foo", is_bot=False) chat = Chat(id=0, type="group") # 追加用户到群组 if not hasattr(chat, 'members'): chat.members = [] chat.members.append(user)该方式适合你的业务逻辑直接读取群组成员列表做判断的测试场景。
方式2:Mock成员查询接口的返回值
如果你的业务逻辑是调用Bot.get_chat_member方法校验用户是否在群内,可以直接Mock该方法的返回,模拟用户已入群的状态,以下是pytest框架的示例:import pytest from telegram import User, Chat, ChatMember def test_user_in_group_logic(monkeypatch): test_user = User(id=123, first_name="Foo", is_bot=False) test_chat = Chat(id=0, type="group") # 模拟get_chat_member返回结果 def mock_get_member(chat_id, user_id): if chat_id == test_chat.id and user_id == test_user.id: return ChatMember(user=test_user, status=ChatMember.MEMBER) raise ValueError("User not found") monkeypatch.setattr("telegram.Bot.get_chat_member", mock_get_member) # 后续业务测试逻辑方式3:构造入群事件触发业务逻辑
如果你的测试目标是验证用户入群后的触发处理逻辑,不需要修改Chat对象本身,直接构造对应的ChatMemberUpdated事件推给你的处理函数即可:from telegram import Update, ChatMember, ChatMemberUpdated test_user = User(id=123, first_name="Foo", is_bot=False) test_chat = Chat(id=0, type="group") # 构造用户入群事件 join_event = ChatMemberUpdated( chat=test_chat, from_user=test_user, date=1690000000, old_chat_member=ChatMember(user=test_user, status=ChatMember.LEFT), new_chat_member=ChatMember(user=test_user, status=ChatMember.MEMBER) ) test_update = Update(update_id=1, chat_member=join_event) # 直接传入你的入群处理回调即可测试 # await your_join_handler(test_update, context)
内容的提问来源于stack exchange,提问作者juju
相关产品推荐
相关产品推荐

