2014-07-02 17 views
13

Tôi đang thử nghiệm một số mã sử dụng os.walk. Tôi muốn tạo một hệ thống tập tin tạm thời, trong bộ nhớ mà tôi có thể cư trú với các tệp mẫu (trống) và các thư mục mà os.walk sẽ trở lại. Điều này sẽ giúp tôi tiết kiệm được sự phức tạp của các cuộc gọi os.walk giả lập để mô phỏng đệ quy.Làm thế nào để giả lập os.walk trong python với một hệ thống tập tin tạm thời?

Cụ thể, mã Tôi muốn thử nghiệm là:

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 

Đây có phải là có thể trong python?

+0

Bạn có muốn chỉ mô phỏng danh sách được trả về hoặc chức năng giống như tệp không? –

+0

Chỉ các danh sách được trả lại. – jbrown

Trả lời

22

Số os.walk() được xây dựng hoàn toàn xung quanh os.listdir(), với sự hỗ trợ của và os.path.isdir(). Đây chủ yếu là các cuộc gọi hệ thống, vì vậy bạn phải giả lập hệ thống tệp ở cấp hệ thống. Trừ khi bạn muốn viết một FUSE plugin, điều này sẽ không dễ dàng giả lập.

Tất cả os.walk() cần phải trả lại là danh sách các bộ dữ liệu, thực sự. Trừ khi bạn đang thử nghiệm thao tác thành phần dirs, nó không thể đơn giản hơn:

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

Tôi nghĩ sẽ khó khăn hơn. Cảm ơn – jbrown

+0

Cảm ơn bạn! Tôi đã viết giải pháp của tôi một chút cô đặc hơn nhưng điều này đã giúp tôi với giải pháp của tôi là tốt. Hãy nhớ rằng "os.walk() cần trả về danh sách các bộ ** **". Giải pháp của tôi: '@patch ('test_module.os.walk') def test_walk (self, os_walk): os.walk.return_value [('/ foo', ('',), ('file.txt' ,))] ' – levibostian

+0

Tôi nghĩ rằng' = 'bị thiếu ở đó; 'os.walk.return_value' không thể lập chỉ mục được. :-) –

Các vấn đề liên quan