Python unittest测试Discord.py命令时传了ctx仍报缺少该参数是什么原因?
问题原因
你遇到的报错本质是discord.py的命令装饰器修改了原方法的结构:你通过@commands.command()装饰list方法后,HierarchyManagement实例的list属性已经不是你定义的原始异步函数,而是被封装成了discord.ext.commands.Command对象。
你直接调用await hierarchyManagement.list(ctx)时,Command对象的调用逻辑不会自动传入实例自身作为self参数,相当于原始函数只收到了1个参数(你传的ctx被当做了self),自然会提示缺少ctx参数。
解决方案
两种可行的修改方式:
方式1:直接调用原始回调函数
Command对象的callback属性存储了未被封装的原始异步方法,你只需要手动传入self和ctx两个参数即可:
# 把原来的await hierarchyManagement.list(ctx)改成 await hierarchyManagement.list.callback(hierarchyManagement, ctx)
方式2:优化测试用例,添加断言校验输出
你不需要手动把ctx.send替换成print,可以直接用Mock的断言能力校验输出是否符合预期,完整修改后的测试代码如下:
import unittest from unittest.mock import Mock from cogs.HierarchyManagement import HierarchyManagement class test_Hierarchies(unittest.IsolatedAsyncioTestCase): async def test_list(self): bot = Mock() ctx = Mock() ctx.message.content = '^list' ctx.message.guild.id = 870166294127837205 ctx.author.mention = '<@368187588340875284>' ctx.author.name = 'NobleUplift' ctx.author.discriminator = '1038' # 直接用Mock的异步方法,不需要替换成print ctx.send = Mock() hierarchyManagement = HierarchyManagement(bot) # 调用原始回调 await hierarchyManagement.list.callback(hierarchyManagement, ctx) # 添加断言校验输出 expected_output = """Hierarchies: • us-army • admins""" ctx.send.assert_awaited_once_with(expected_output) if __name__ == '__main__': unittest.main()
内容的提问来源于stack exchange,提问作者NobleUplift
相关产品推荐
相关产品推荐

