2011-06-15 8 views
14

के साथ रिटर्न इटरबल मैं पाइथन में एक फ़ंक्शन अनुकरण करने के लिए मॉक का उपयोग करने की कोशिश कर रहा हूं। यहां मेरा कोड है:मैक पायथन

resp, content = 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

मैंने यह कोशिश नहीं की है लेकिन मुझे एक आसान समाधान मिला। मॉड्यूल को पैच करने के बजाय, फ़ंक्शन को स्वयं पैच करें और फिर पैच.रेर्न_वल्यू सेट करें। ईमानदारी से, मुझे पूरा यकीन नहीं है कि यह क्यों काम करता है लेकिन इस तरह, फ़ंक्शन एक मॉक ऑब्जेक्ट नहीं लौटा रहा है। प्रतिक्रिया के लिए धन्यवाद, यद्यपि। – Matt

7

मुझे संदेह है कि आपकी समस्या यह है कि आप नकली उदाहरण का उपयोग नहीं कर रहे हैं जो आपको लगता है कि आप हैं। डिफ़ॉल्ट रूप से मॉक का एक उदाहरण कॉल करते समय एक मॉक देता है।

>>> 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'