2014-07-02 17 views
13

Sto provando a testare del codice che utilizza os.walk. Voglio creare un filesystem temporaneo, in memoria, che possa essere compilato con file e directory (vuoti) di esempio che verranno restituiti da os.walk. Questo dovrebbe salvarmi la complessità delle chiamate os.walk simulate alla ricorsione.Come imitare os.walk in python con un filesystem temporaneo?

In particolare, il codice Voglio testare è:

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 

Questo è possibile in Python?

+0

vuoi prendere in giro solo le liste restituito, o la piena funzionalità simile a file? –

+0

Restituiscono solo gli elenchi. – jbrown

risposta

22

No. os.walk() è costruito interamente intorno a os.listdir(), con assistenza di e os.path.isdir(). Si tratta essenzialmente di chiamate di sistema, quindi è necessario prendere in giro il proprio filesystem a livello di sistema. A meno che tu non voglia scrivere un FUSE plugin questo non sarà facile da prendere in giro.

Tutti gli os.walk() devono restituire una lista di tuple, davvero. A meno che non si sta testando manipolare la componente dirs, non potrebbe essere più semplice:

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

Ho pensato che sarebbe stato più difficile. Grazie – jbrown

+0

Grazie! Ho scritto la mia soluzione un po 'più concisa ma questo mi ha aiutato anche con la mia soluzione. Ricorda che os.walk() deve restituire un ** elenco di tuple ** ". La mia soluzione: '@patch ('test_module.os.walk') def test_walk (self, os_walk): os.walk.return_value [('/ foo', ('',), ('file.txt' ,))] ' – levibostian

+0

Penso che ci sia' = '; 'os.walk.return_value' non è indicizzabile. :-) –