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
相关产品推荐
相关产品推荐

