在Python中模拟目录结构

时间:2014-10-17 20:49:42

标签: python unit-testing

我有一些代码,我用来接受文件输入,打开和处理,然后输出一些数据。我已经使功能正常工作,我现在对其进行单元测试,下面是代码示例。

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 个答案:

答案 0 :(得分:7)

您不需要创建虚假的目录结构,您只需要模拟isdir()listdir()函数。

使用unittest.mock library(或外部mock library,这与Python版本< 3.3)完全相同:

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')