如何在Python Mock中筛选出对应call_count的目标调用记录?
筛选MagicMock调用记录,仅保留对应call_count的顶层调用
问题重现
代码示例:
from mock import MagicMock mock = MagicMock() mock.get_query(arg=1).execute() mock.get_query(arg=2).execute() print('count:', mock.get_query.call_count) print('calls:', mock.get_query.mock_calls)
实际输出:
count: 2 calls: [call(arg=1), call().execute(), call(arg=2), call().execute()]
期望输出:
count: 2 calls: [call(arg=1), call(arg=2)]
解决方案
方法1:直接使用call_args_list属性
MagicMock的call_args_list属性专门存储当前mock对象的所有直接调用记录,完全匹配call_count统计的次数,无需手动筛选。
修改后的代码:
from mock import MagicMock mock = MagicMock() mock.get_query(arg=1).execute() mock.get_query(arg=2).execute() print('count:', mock.get_query.call_count) print('calls:', mock.get_query.call_args_list)
输出结果与期望完全一致。
方法2:手动筛选mock_calls
如果必须从mock_calls中筛选,可以通过判断调用记录的parent属性是否指向当前mock对象来过滤子mock的调用:
from mock import MagicMock mock = MagicMock() mock.get_query(arg=1).execute() mock.get_query(arg=2).execute() filtered_calls = [call for call in mock.get_query.mock_calls if call.parent is mock.get_query] print('count:', mock.get_query.call_count) print('calls:', filtered_calls)
该方法同样能得到目标结果,但不如第一种方式简洁直接,推荐优先使用call_args_list。
内容的提问来源于stack exchange,提问作者Jerther
相关产品推荐
相关产品推荐

