2012-02-19 10 views
6

मजाक इस पढ़ने के बाद: How do I mock an open used in a with statement (using the Mock framework in Python)?अजगर मॉक - कई खुला

मैं का उपयोग कर अजगर में खुला समारोह नकली कर सकती हूं:

with patch(open_name, create=True) as mock_open: 
    mock_open.return_value = MagicMock(spec=file) 
    m_file = mock_open.return_value.__enter__.return_value 
    m_file.read.return_value = 'text1' 

    diffman = Diffman() 
    diffman.diff(path1, path2) 

यह अच्छी तरह से काम करता है जब मेरी जांच की विधि एक खुला बयान का इस्तेमाल किया।

def diff(self, a, b): 
    with open(a, 'r') as old: 
     with open(b, 'r') as new: 
      oldtext = old.read() 
      newtext = new.read() 

oldtext और newtext के मूल्यों में एक ही ('टेक्स्ट 1' यहाँ) हैं: यहाँ मेरी जांच की विधि है।

मैं पुराने टेक्स्ट के लिए 'text1' और newtext के लिए 'text2' रखना चाहता हूं।

मैं यह कैसे कर सकता हूं?

उत्तर

5

यहां आप जो चाहते हैं उसे पाने का एक त्वरित तरीका है। यह थोड़ा सा धोखा देता है क्योंकि परीक्षण के तहत विधि में दो फ़ाइल ऑब्जेक्ट एक ही ऑब्जेक्ट होते हैं और हम प्रत्येक पढ़ने के बाद रीड कॉल के रिटर्न वैल्यू को बदल रहे हैं। यदि आप फ़ाइल ऑब्जेक्ट्स अलग होना चाहते हैं तो आप एक ही तकनीक का उपयोग कई परतों में कर सकते हैं, लेकिन यह काफी गन्दा होगा और यह अनावश्यक रूप से परीक्षण के इरादे को छिपा सकता है।

 
    m_file.read.return_value = 'text1' 

साथ:

 
    reads = ['text1', 'text2'] 
    m_file.read.side_effect = lambda: reads.pop(0) 
3

शायद एक अच्छा संभव समाधान पहले से बेहतर हो ही आसानी से इसे परीक्षण के लिए उधार देता है कि एक तरह से कोड लिखने के लिए

इस लाइन को बदलें। 'Diff' के मामले में, यह काफी आसान लगता है (स्वीकार्य रूप से अधिक अन्य संदर्भ नहीं है) अलग-अलग फ़ाइल ऑब्जेक्ट्स के तर्क के रूप में भिन्नता लेने के लिए। यह संभवतः कोड में बनाने के लिए काफी छोटा बदलाव है, और परीक्षण को बहुत आसान बनाता है, क्योंकि जब आप इसका परीक्षण करते हैं तो आप आसानी से mock फ़ाइल ऑब्जेक्ट्स को diff() तक प्रदान कर सकते हैं, इसके बजाय दो उदाहरणों का मज़ाक उड़ाते हुए हुप्स के माध्यम से कूदने की कोशिश करने के बजाय एक संदर्भ प्रबंधक के रूप में निर्मित कार्य प्रबंधक ... स्वयं ... या कुछ ;-)

import StringIO 

diff(a, b): 
    oldtext = a.read() 
    newtext = b.read() 

def test_diff(): 
    a = StringIO.StringIO('text1') 
    b = StringIO.StringIO('text2') 

    res = diff(a, b) 
    <some assertion here> 

क्या यह आपके मामले के लिए काम करेगा?

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