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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:48:00