33

os.walk を使用するコードをテストしようとしています。os.walk が返すサンプル (空の) ファイルとディレクトリを格納できる一時的なインメモリ ファイルシステムを作成したいと考えています。これにより、再帰をシミュレートするために 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

これはpythonで可能ですか?

4

1 に答える 1

51

No.は、との助けを借りて、 のos.walk()周りに完全に構​​築されています。これらは基本的にシステム コールなので、システム レベルでファイルシステムをモックする必要があります。FUSE プラグインを作成したい場合を除き、これをモックするのは簡単ではありません。os.listdir()os.path.islink()os.path.isdir()

os.walk()返す必要があるのは、実際にはタプルのリストだけです。コンポーネントの操作をテストしていない限りdirs、これ以上簡単なことはありません。

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

これは、次のディレクトリ構造を模倣します。

/foo
 ├── baz
 └── bar 
     ├── spam
     └── eggs
于 2014-07-02T14:14:43.123 に答える