2013-07-31 63 views
2

在python 2.6或2.7,我想擺脫使用Mock.call_args_list時的'調用'的東西。刪除調用()時使用模擬

我基本上想檢查模擬是否在一些參數時被調用。

我有類似:

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

但call_args_list樣子:

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

如何訪問到arg2的價值恰恰不會重新創建一個完整的呼叫對象?

如果有一種方法可以遍歷所有「調用」對象並獲取所有參數的列表並只提取我需要的任何東西?

事情是,以前我沒有問題,call_args_list返回列表沒有這個「通話」的東西,我能夠做我想做的,但由於某種原因,「通話」開始出現,我不不知道如何正確處理它。

回答

2

你可以這樣做:

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

這會給你的名字(不總是可用),位置參數和調用的關鍵字參數。根據the documentationcall_args_list中的call()對象實際上是具有兩個值的元組,而不是三個元組。所以你可以這樣做:

>>> 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})] 
+0

感謝這個答案。 對於call_args_list,[0]是arg列表,[1]似乎是kwargs。 – Gaetan

+0

2項目和3項目元組的通用變體: 'args,kwargs = a.call_args [: - 2]' - 這裏我們總是取最後2項。 – MarSoft