2014-07-02 22 views
13

Próbuję przetestować kod, który używa os.walk. Chcę utworzyć tymczasowy system plików w pamięci, który będę mógł wypełnić przykładowymi (pustymi) plikami i katalogami, które następnie zwróci. To powinno zaoszczędzić mi złożoności wyszydzania wywołań os.walk w celu symulacji rekursji.Jak wyśmiać os.walk w python z tymczasowym systemem plików?

Konkretnie, kod Chcę przetestować to:

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 

Jest to możliwe w Pythonie?

+0

Chcesz wyśmiewać tylko wykazy zwrócone lub pełna funkcjonalność plikopodobnym? –

+0

Powróciły tylko listy. – jbrown

Odpowiedz

22

Numer os.walk() jest zbudowany w całości wokół os.listdir(), z pomocą i os.path.isdir(). Zasadniczo są to wywołania systemowe, więc musisz sfałszować swój system plików na poziomie systemu. Jeśli nie chcesz pisać FUSE plugin, nie będzie łatwo udawać.

Wszystkie os.walk() należy zwrócić listę krotek, naprawdę. Chyba, że ​​są badania manipulując składnik dirs, to nie może być bardziej prosty:

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

Myślałem, że będzie to trudniejsze. Dzięki – jbrown

+0

Dziękujemy! Napisałem swoje rozwiązanie nieco bardziej skondensowane, ale pomogło mi to również w rozwiązaniu. Pamiętaj, że "os.walk() musi zwrócić ** listę krotek **". Moje rozwiązanie: '@patch ('test_module.os.walk') def test_walk (self, os_walk): os.walk.return_value [('/ foo', ('',), ('plik.txt' ,))] ' – levibostian

+0

Myślę, że brakuje tam' = '; 'os.walk.return_value' nie podlega indeksowaniu. :-) –