如何使用临时文件系统在python中模拟os.walk?
我正在测试一些使用os.walk的代码。我想创建一个临时的内存文件系统,我可以用示例(空)文件和目录填充它,然后os.WACK将返回这些文件和目录。这应该可以让我省去模拟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):
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
组件,那么测试将需要更新。如果使用列表,您很容易忘记这一点。:-)