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

Python中如何测试方法调用列表的方法名及传入参数?

如何获取unittest.mock中method_calls的方法名和参数?

我用以下代码打印测试方法中被调用的方法列表:

import unittest
from unittest.mock import patch, Mock, call

class MyTest(unittest.TestCase):
    @patch(mymodule.DepObj)
    def mytest(self, mock_obj):
        mock_obj_ret = mock_obj.return_value # 构造函数返回的对象

        # 调用待测试方法

        callList = mock_obj_ret.method_calls
        self.assertEqual(5, len(callList))
        print(callList)

callList的输出类似:

[call.mymethod0(), call.mymethod1(MYARG1, key=val), call.mymethod2(myarg1, myarg2), call.mymethod3(myarg3), ...]

我需要验证callList中方法调用的名称(保证顺序正确)和传入参数,但找不到访问方法名的方式。试了self.assertEqual("mymethod2", callList[1].name)不行,打印vars(callList[1])也没帮助:

{'_mock_name': None, '_mock_parent': None, '_mock_from_kall': True}

目前已经能通过以下方式获取单个调用的args和kwargs:

print(mock_obj_ret.method_calls[1].args)
print(mock_obj_ret.method_calls[1].kwargs)

但不知道怎么获取被调用方法的字符串名称。


解决方案

要获取方法名,最稳妥的方式是通过索引访问call对象的第一个元素:

# 获取第2个调用的方法名
method_name = callList[1][0]
self.assertEqual("mymethod1", method_name)

你也可以一次性解构出方法名、位置参数和关键字参数,这样能同时验证所有信息:

method_name, args, kwargs = callList[1]
self.assertEqual("mymethod1", method_name)
self.assertEqual((MYARG1,), args)
self.assertEqual({"key": val}, kwargs)

另外,也可以通过call对象的私有属性_name获取方法名,但不推荐依赖私有属性,避免版本更新导致失效:

method_name = callList[1]._name

内容的提问来源于stack exchange,提问作者JohnK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:43:19