长时间听众,第一次来电。
我编写了一个 python 2.7 方法,该方法对给定目录执行递归扫描(使用scandir
),该目录具有一些find
类功能(即,您可以指定mindepth
和maxdepth
):
def scan_tree(self, search_path, max_levels=-1, min_levels=-1, _level=0):
"""Recursively yield DirEntry objects for given directory."""
max_out = max_levels > -1 and _level == max_levels
min_out = min_levels > -1 and _level <= min_levels
for entry in scandir(search_path):
if entry.is_dir(follow_symlinks=False) and not max_out:
for child in self._scan_tree(entry.path, max_levels,
min_levels, _level + 1):
if not child.is_dir(follow_symlinks=False):
yield child
elif not min_out:
yield entry
问题是,我不能为我的生活找出编写单元测试的最佳/正确方法,这将允许我mock
递归scandir
调用正确和测试我的最小和最大扫描参数的行为。
通常我会使用scandir.walk
进行扫描(我已经编写了一个可正确测试的版本),但我确实需要DirEntry
个scandir
个实例的信息。吐出来。
任何想法都将不胜感激。谢谢!
答案 0 :(得分:0)
我可以提出另一种解决方案:
创建目录结构
扭转局面:问问自己&#39;我想要什么?&#39;。我认为它有一个固定的目录结构来测试。我们可以使用os
包函数来创建这样的结构,例如makedirs,而只需调用真实scandir
,但修复search_path
是固定的&#39 ; testdir&#39;:当前工作目录的子目录。
E.g。做类似的事情:
basedir = os.path.dirname(__file__)
os.makedirs(os.path.join(basedir, '/testdirectory/first/second'))
os.makedirs(os.path.join(basedir, '/testdirectory/another/'))
"""You can create some additional empty files and directories if you want"""
"""(...)"""
"""Do the rest of your work here"""
然后,作为错误处理程序中的清理操作,在测试结束时,不要忘记调用它来删除临时文件:
shutil.rmtree(os.path.join(basedir, '/testdirectory/'))
使用真实目录的好处是我们可以使用python的操作系统差异和特性的抽象继续工作,而不必重新创建它们以使测试代码正确模仿真实的东西遭遇。
本答案中的代码示例中没有异常处理。你必须自己添加它。