Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用临时文件系统在python中模拟os.walk?_Python_Unit Testing_Testing_Mocking_Python Mock - Fatal编程技术网

如何使用临时文件系统在python中模拟os.walk?

如何使用临时文件系统在python中模拟os.walk?,python,unit-testing,testing,mocking,python-mock,Python,Unit Testing,Testing,Mocking,Python Mock,我正在测试一些使用os.walk的代码。我想创建一个临时的内存文件系统,我可以用示例(空)文件和目录填充它,然后os.WACK将返回这些文件和目录。这应该可以让我省去模拟os.walk调用来模拟递归的复杂性 具体来说,我要测试的代码是: if recursive: log.debug("Recursively searching for files under %s" % path) for (dir_path, dirs, files) in os.walk(path):

我正在测试一些使用os.walk的代码。我想创建一个临时的内存文件系统,我可以用示例(空)文件和目录填充它,然后os.WACK将返回这些文件和目录。这应该可以让我省去模拟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中可能吗

No.
os.walk()
完全围绕着它构建,借助于
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

您想只模拟返回的列表,还是模拟完整的类似文件的功能?只模拟返回的列表。我想这会更困难。谢谢你!我把我的解决方案写得更简洁了一点,但这对我的解决方案也有帮助。请记住“os.walk()需要返回元组列表”。我的解决方案:
@patch('test_module.os.walk')def test_walk(self,os_walk):os.walk.return_value[('/foo',('',),('file.txt',)]
我认为那里缺少一个
=
<代码>操作系统漫游返回值不可索引。:-)实际上,('spam',eggs')可能是
[],['spam',eggs']
。并不是说你的代码在这里不起作用,但如果你更接近真实的代码也不会有什么坏处。@naxa:事实上,这是因为如果你更改了测试中的代码来操作
dir
组件,那么测试将需要更新。如果使用列表,您很容易忘记这一点。:-)