2014-07-02 3 views
13

मैं os.walk का उपयोग करने वाले कुछ कोड का परीक्षण करने की कोशिश कर रहा हूं। मैं एक अस्थायी, इन-मेमोरी फाइल सिस्टम बनाना चाहता हूं जिसे मैं नमूना (खाली) फ़ाइलों और निर्देशिकाओं के साथ पॉप्युलेट कर सकता हूं जो os.walk फिर वापस आ जाएंगे। यह मुझे रिकर्सन अनुकरण करने के लिए os.walk कॉल mocking की जटिलता बचा लेना चाहिए।एक अस्थायी फाइल सिस्टम के साथ पायथन में os.walk नकली कैसे करें?

विशेष रूप से, कोड मैं परीक्षण करना चाहते है:

if recursive: 
    log.debug("Recursively searching for files under %s" % path) 

    for (dir_path, dirs, files) in os.walk(path): 
     log.debug("Found %d files in %s: %s" % (len(files), path, files)) 
     for f in [os.path.join(dir_path, f) for f in files 
        if not re.search(exclude, f)]: 
      yield f 
else: 
    log.debug("Non-recursively searching for files under %s" % path) 

    for (dir_path, dirs, files) in os.walk(path): 
     log.debug("Found %d files in %s: %s" % (len(files), path, files)) 
     for f in [os.path.join(dir_path, f) for f in files 
        if not re.search(exclude, f)]: 
      yield f 

अजगर में यह संभव है?

+0

केवल सूचियों लौटे आपका उपहास करना चाहते हैं, या पूर्ण फ़ाइल जैसी कार्यप्रणाली? –

+0

केवल सूचियां लौटा दी गईं। – jbrown

उत्तर

22

सं os.walk() और os.path.isdir() की सहायता से, पूरी तरह से चारों ओर os.listdir() का निर्माण किया है। ये अनिवार्य रूप से सिस्टम कॉल हैं, इसलिए आपको सिस्टम स्तर पर अपने फाइल सिस्टम का नकल करना होगा। जब तक आप FUSE plugin लिखना नहीं चाहते हैं, यह नकली आसान नहीं होगा।

सभी os.walk() लौटने की जरूरत है वास्तव में tuples की एक सूची है। जब तक आप dirs घटक जोड़ तोड़ परीक्षण कर रहे हैं, इसे और अधिक आसान नहीं हो सकता है:

with mock.patch('os.walk') as mockwalk: 
    mockwalk.return_value = [ 
     ('/foo', ('bar',), ('baz',)), 
     ('/foo/bar',(), ('spam', 'eggs')), 
    ] 
+0

मैंने सोचा कि यह और अधिक कठिन होगा। धन्यवाद – jbrown

+0

धन्यवाद! मैंने अपना समाधान थोड़ा और अधिक संघनित लिखा लेकिन इससे मुझे मेरे समाधान के साथ भी मदद मिली। याद रखें "os.walk() को ** ** tuples की सूची ** वापस करने की आवश्यकता है"। मेरा समाधान: '@ पैच ('test_module.os.walk') def test_walk (self, os_walk): os.walk.return_value [('/ foo', ('',), ('file.txt' ,))] ' – levibostian

+0

मुझे लगता है कि वहां' '' गायब है; 'os.walk.return_value' सूचकांक नहीं है। :-) –

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