2011-11-17 4 views
13

में फ़ाइल ऑब्जेक्ट्स या इटेरबल्स मॉकिंग mock लाइब्रेरी का उपयोग करते हुए open() द्वारा कोड ऑब्जेक्ट्स को वापस करने और परीक्षण करने के लिए उचित तरीका है?पाइथन

whitelist_data.py:

WHITELIST_FILE = "testdata.txt" 

format_str = lambda s: s.rstrip().lstrip('www.') 
whitelist = None 

with open(WHITELIST_FILE) as whitelist_data: 
    whitelist = set(format_str(line) for line in whitelist_data) 

if not whitelist: 
    raise RuntimeError("Can't read data from %s file" % WHITELIST_FILE) 

def is_whitelisted(substr): 
    return 1 if format_str(substr) in whitelist else 0 

यहाँ कैसे मैं इसे परीक्षण करने की कोशिश है।

import unittest 
import mock 

TEST_DATA = """ 
domain1.com 
domain2.com 
domain3.com 
""" 

class TestCheckerFunctions(unittest.TestCase): 

    def test_is_whitelisted_method(self): 
     open_mock = mock.MagicMock() 
     with mock.patch('__builtin__.open',open_mock): 
      manager = open_mock.return_value.__enter__.return_value 
      manager.__iter__ = lambda s: iter(TEST_DATA.splitlines()) 
      from whitelist_data import is_whitelisted 
      self.assertTrue(is_whitelisted('domain1.com')) 

if __name__ == '__main__': 
    unittest.main() 

python tests.py का परिणाम है:

$ python tests.py 

E 
====================================================================== 
ERROR: test_is_whitelisted_method (__main__.TestCheckerFunctions) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "tests.py", line 39, in test_is_whitelisted_method 
    from whitelist_data import is_whitelisted 
    File "/Users/supa/Devel/python/whitelist/whitelist_data.py", line 20, in <module> 
    whitelist = set(format_str(line) for line in whitelist_data) 
TypeError: 'Mock' object is not iterable 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

युपीडी: एडम, मैं पुनर्स्थापित किया है नकली पुस्तकालय (pip install -e hg+https://code.google.com/p/mock#egg=mock) और अद्यतन tests.py के लिए धन्यवाद। एक जादू की तरह काम करता है।

उत्तर

15

आप MagicMock खोज रहे हैं। यह पुनरावृत्ति का समर्थन करता है।

नकली 0.80beta4, patchMagicMock देता है। तो यह सरल उदाहरण काम करता है:

import mock 

def foo(): 
    for line in open('myfile'): 
     print line 

@mock.patch('__builtin__.open') 
def test_foo(open_mock): 
    foo() 
    assert open_mock.called 

आप नकली 0.7.x चला रहे हैं (ऐसा लगता है कि आप कर रहे हैं), मुझे नहीं लगता कि तुम अकेले पैच के साथ यह पूरा कर सकते हैं। फिर आप यह पैच में पारित, अलग से नकली बनाने की आवश्यकता होगी:

import mock 

def foo(): 
    for line in open('myfile'): 
     print line 

def test_foo(): 
    open_mock = mock.MagicMock() 
    with mock.patch('__builtin__.open', open_mock): 
     foo() 
     assert open_mock.called 

नोट - मैं py.test के साथ इन दौड़े हैं, हालांकि, ये वही दृष्टिकोण unittest के साथ भी काम करेंगे।