我使用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
。我想测试下载的图像。如何测试这个?
答案 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在隔离的文件系统中运行您的单元测试。运行每个测试用例后,将文件系统还原为干净状态。这是一种大锤方法,但是对于测试非常复杂的库,可能更容易使这种方法起作用。