如何在没有文件系统访问的情况下对'mkdir'功能进行单元测试?

时间:2014-07-11 14:34:41

标签: python unit-testing tdd

我使用py.test进行单元测试。我有这样的事情:

Class Site(object):

    def set_path(self):
        """Checks if the blog folder exists. Creates new folder if necessary."""        
        if not os.path.isdir(self.user_dir):
            print "Creating new directory:", self.user_dir
            os.mkdir(self.user_dir)
        else:
            print "\n**", self.user, "directory already exists."

如何在不触及文件系统的情况下对此进行单元测试?

处理此类问题时是否有一般的经验法则?

我已经考虑了很长时间了,我想不出解决方案。

我的应用程序将包含许多文件系统访问,我不知道在单元测试时如何合并这些方法。

我想专门测试是否在正确的路径中创建了一个文件夹。路径为self.user_dir

我还有一个下载功能,可以将图像下载到self.user_dir。我想测试下载的图像。如何测试这个?

1 个答案:

答案 0 :(得分:3)

您可以使用两种方法,模拟(首选)或隔离:

<强>惩戒:

在测试时,将os.mkdir替换为&#34; mock&#34;版本:

class MockMkdir(object):
    def __init__(self):
        self.received_args = None
    def __call__(*args):
        self.received_args = args

class MyTest(unittest.TestCase):
    def setUp():
        self._orig_mkdir = os.mkdir
        os.mkdir = MockMkdir()
    def tearDown():
        os.mkdir = self._orig_mkdir
    def test_set_path(self):
        site = Site()
        site.set_path('foo/bar')
        self.assertEqual(os.mkdir.received_args[0], 'foo/bar')

Mock是一个库,它可以帮助您更优雅地执行此类操作并减少代码行。

<强>隔离

使用chroot在隔离的文件系统中运行您的单元测试。运行每个测试用例后,将文件系统还原为干净状态。这是一种大锤方法,但是对于测试非常复杂的库,可能更容易使这种方法起作用。