【问题标题】:How to Unit Test 'mkdir' function without file system access?如何在没有文件系统访问权限的情况下对“mkdir”功能进行单元测试?
【发布时间】:2014-07-11 14:34:41
【问题描述】:

我使用 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。我想测试图像是否已下载。如何进行测试?

【问题讨论】:

标签: python unit-testing tdd


【解决方案1】:

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

嘲讽:

在测试时,将 os.mkdir 替换为“模拟”版本:

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 在隔离的文件系统中运行您的单元测试。运行每个测试用例后,将文件系统恢复到干净状态。这是一种大锤方法,但对于测试非常复杂的库,让这种方法更容易工作。

【讨论】:

    猜你喜欢
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多