2012-07-05 13 views
16

मैं नमूना कोड का निम्न भाग पर काम करने के mock.patch पाने के लिए कोशिश कर रहा हूँ में इंपोर्ट स्टेटमेंट:से नकली पैचिंग/अजगर

d: defaultdict(None, {}) 

जिसका मतलब है:

from mock import patch 
from collections import defaultdict 

with patch('collections.defaultdict'): 
    d = defaultdict() 
    print 'd:', d 

यह निम्न आउटपुट कि डिफॉल्टडिक्ट पैच नहीं किया गया था।

अगर मैं एक सीधे इंपोर्ट स्टेटमेंट यह काम करता है के साथ से/आयात बयान बदल देते हैं:

from mock import patch 
import collections 

with patch('collections.defaultdict'): 
d = collections.defaultdict() 
print 'd:', d 

आउटपुट है:

d: <MagicMock name='defaultdict()' id='139953944084176'> 

वहाँ एक कॉल/आयात से का उपयोग कर पैच करने के लिए कोई तरीका है?

from mock import patch 
from collections import defaultdict 

with patch('__main__.defaultdict'): 
    d = defaultdict() 
    print 'd:', d 

यदि आप किसी आयातित मॉड्यूल के लिए कुछ मजाक कर रहे हैं, हालांकि, आप चाहेंगे:

उत्तर

21

आप एक ही मॉड्यूल में कुछ पैचिंग कर रहे हैं, आप का उपयोग कर सकते हैं __main__

धन्यवाद इसलिए सही संदर्भ (या नाम) समझौता है कि मॉड्यूल के नाम का उपयोग करें:

# foo.py 

from collections import defaultdict 

def bar(): 
    return defaultdict() 


# foo_test.py  

from mock import patch 
from foo import bar 

with patch('foo.defaultdict'): 
    print bar() 

यहां मुद्दा यह है कि पैच बात यह पैच है करने के लिए पूरा पथ चाहता है। वर्तमान मॉड्यूल में कुछ पैच करते समय यह थोड़ा अजीब दिखता है, क्योंकि लोग अक्सर __main__ (या उस मामले के लिए वर्तमान मॉड्यूल को संदर्भित नहीं करते हैं) का उपयोग नहीं करते हैं।

7

patchनाम पैचिंग द्वारा काम करता है। यदि आप ऑब्जेक्ट तक पहुंचने के लिए defaultdict (स्थानीय नेमस्पेस में) नाम का उपयोग कर रहे हैं तो आप collections.defaultdict नाम पैच करके कुछ हासिल नहीं कर सकते हैं। http://www.voidspace.org.uk/python/mock/patch.html#id1 पर प्रलेखन देखें।

+3

क्या इसका मतलब यह नहीं है कि यदि आप 'एक्स आयात वाई' या 'आयात X.Y'' का उपयोग करते हैं तो क्या आप कार्यान्वयन विस्तार को बदलते हैं, तो आपके यूनिट परीक्षण चुपचाप बहुत अलग व्यवहार करना शुरू कर देंगे? – detly

+0

@detly: मुझे विश्वास है कि यह सच है, हालांकि मैं नकली से परिचित नहीं हूं इसलिए मैं अनुभव से नहीं कह सकता। – BrenBarn

+0

@ हाल ही में हाँ, यह सही है – Daenyth

संबंधित मुद्दे