2011-06-15 39 views
14

我試圖用模擬來模擬python中的函數。這裏是我的代碼:使用模擬Python返回Iterable

resp, content = request(...) 

request()函數需要返回兩個值。以下是我的嘗試:

with patch("syncdatetime.py") as sync_mock: 
     sync_mock.request.return_value = [obj, ''] 

但是當我運行測試時,出現錯誤「模擬對象不可迭代」。請求函數返回一個Mock類型的對象而不是一個列表。我如何修補請求函數以便它返回一個列表?披露的

回答

7

注意,我是新來的嘲笑,所以我不是專家,不過,我剛剛遭遇了同樣的問題,發現設置side_effect屬性返回數組的功能修復的東西

從你的示例代碼,更改:

with patch("syncdatetime.py") as sync_mock: 
    sync_mock.request.return_value = [obj, ''] 

with patch("syncdatetime.py") as sync_mock: 
    sync_mock.request.side_effect = function_returning_list 

,並定義

def function_returning_list(arg_list_of_choice): 
    #anything you want to do goes here 
    #then 
    return your_list 
+2

我沒有試過這個,但我找到了一個更簡單的解決方案。不是修補模塊,而是修補函數本身,然後設置patch.return_value。老實說,我不完全確定這是爲什麼這樣工作,但這種方式,該函數不返回一個Mock對象。不過謝謝你的迴應。 – Matt 2011-06-20 18:37:21

7

我懷疑你的問題是你沒有使用你認爲你是模擬的實例。默認情況下,一個Mock的實例在被調用時返回一個模擬。

>>> m = mock.Mock() 
>>> type(m()) 
<class 'mock.mock.Mock'>  

它看起來像您的來電request,因爲return_value尚未初始化,這意味着resp, content = request()試圖解開一個模仿對象返回一個模擬。

>>> m = mock.Mock() 
>>> (a, b) = m() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'Mock' object is not iterable 

您不應該使用side_effect來返回一個列表。指定return_value應該可以工作。

>>> m = mock.Mock() 
>>> m.return_value = ['a', 'b'] 
>>> (a, b) = m() 
>>> a 
'a' 
>>> b 
'b'