使用Mock时删除call()

时间:2013-07-31 16:59:44

标签: python mocking

在python 2.6或2.7中,我想在使用Mock.call_args_list时摆脱'调用'的东西。

我基本上想检查一些参数时是否调用了mock。

我有类似的东西:

a = Mock()
...
self.assertEqual(a.call_args_list, ...)

但是call_args_list看起来像:

[call(arg1, arg2, arg3), call(...)]

如何在不重新创建完整调用对象的情况下精确访问arg2值?

如果有办法迭代所有“调用”对象并得到所有参数的列表并只提取我需要的东西?

事情是,以前我没有问题,call_args_list返回我的列表没有这个“调用”的东西,我能够做我想做的事情,但由于某种原因,“呼叫”开始出现,我不'我知道如何正确处理它。

1 个答案:

答案 0 :(得分:2)

你可以这样做:

>>> import mock
>>> my_call = mock.call('test', example=3)
>>> name, args, kwargs = my_call
>>> name
''
>>> args
('test',)
>>> kwargs
{'example': 3}

这将为您提供名称(并非始终可用),位置参数和调用的关键字参数。根据{{​​3}},call()中的call_args_list对象实际上是具有两个值的元组,而不是三个。所以你可以这样做:

>>> args, kwargs = my_call

您还可以使用索引获取值。例如,my_call[2]将为您提供关键字参数。这可用于将call_args_list转换为参数:

>>> call1 = mock.call('test', example=3)
>>> call2 = mock.call('test', example=4, value=5)
>>> call_args_list = [call1, call2]
>>> [(item[1], item[2]) for item in call_args_list]
[(('test',), {'example': 3}), (('test',), {'example': 4, 'value': 5})]