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 回答