walk ruta for files dirs python unit-testing testing mocking python-mock

ruta - ¿Cómo simular os.walk en python con un sistema de archivos temporal?



for root dirs files in os walk ruta (1)

No. os.walk() se construye completamente alrededor de os.listdir() , con la asistencia de os.path.islink() y os.path.isdir() . Estas son esencialmente llamadas al sistema, por lo que tendrías que burlarte de tu sistema de archivos a nivel del sistema . A menos que quiera escribir un plugin FUSE, esto no será fácil de burlar.

Todo lo que os.walk() necesita devolver es una lista de tuplas, de verdad. A menos que esté probando la manipulación del componente dirs , no podría ser más simple:

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

Esto se burlaría de la siguiente estructura de directorios:

/foo ├── baz └── bar ├── spam └── eggs

Estoy tratando de probar un código que usa os.walk. Quiero crear un sistema de archivos en memoria temporal que pueda llenar con archivos de muestra (vacíos) y directorios que luego devolverá os.walk. Esto debería ahorrarme la complejidad de burlarse de las llamadas os.walk para simular la recursión.

Específicamente, el código que quiero probar es:

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

¿Es esto posible en python?