在Python中模拟目录结构

9 投票
1 回答
10735 浏览
提问于 2025-04-28 04:50

我有一些代码,用来处理输入的文件,打开它们并进行处理,然后输出一些数据。这个功能我已经实现了,现在正在进行单元测试,下面是代码的一个例子。

def foo(dir):
    path_to_search = join(dir, "/baz/foo")

   if isdir(path_to_search): 
   #path exists so do stuff...

        for fname in listdir(path_to_search):
            do_stuff()

   else:
       print "path doesn't exist"

我已经能够轻松创建一个测试,确保过去的文件不存在,但正如你看到的,我在代码中检查了目录结构中的“/baz/foo”部分是否存在(在实际运行中,这个目录结构必须有这个文件,但在某些情况下,它可能不存在,我们就不需要处理它)。

我尝试使用TempDir和join来创建一个临时的目录结构,但代码总是提示路径不存在。

有没有办法模拟os.listdir的输出,这样我就不需要创建一个符合/baz/foo规范的临时目录结构呢?

暂无标签

1 个回答

12

你不需要创建一个假的目录结构,其实你只需要模拟一下 isdir()listdir() 这两个函数就可以了。

可以使用 unittest.mock(或者对于 Python 3.3 之前的版本,可以使用外部的 mock,这两个库的功能是一样的):

try:
    # Python >= 3.3 
    from unittest import mock
except ImportError:
    # Python < 3.3
    import mock

with mock.patch('yourmodule.isdir') as mocked_isdir, \
        mock.patch('yourmodule.listdir') as mocked_listdir:
    mocked_isdir.return_value = True
    mocked_listdir.return_value = ['filename1', 'filename2']

    yourmodule.foo('/spam/eggs')

    mocked_isdir.assert_called_with('/spam/eggs/baz/foo')
    mocked_listdir.assert_called_with('/spam/eggs/baz/foo')

撰写回答