python - 单元测试输入验证(python)
问题描述
我进行以下输入验证检查:
self.path = kwargs.get('path', default_path)
if not os.path.isdir(self.path):
raise ValueError(msg1)
if not os.access(self.path, os.W_OK):
raise ValueError(msg2)
测试它的最佳方法是什么(在单元测试中)?
澄清:我想检查以下内容:
- 如果路径不是目录,函数应该引发 ValueError
- 如果路径是不可写的目录,函数应该引发 ValueError
解决方案
测试此功能的最简单方法是模拟相应的os
功能。假设您的函数如下所示:
class MyClass:
def __init__(self):
self.path = None
def get_path(self, *args, **kwargs):
self.path = kwargs.get('path', 'default_path')
if not os.path.isdir(self.path):
raise ValueError('message 1')
if not os.access(self.path, os.W_OK):
raise ValueError('message 2')
如果使用unittest
,您的测试可能如下所示:
class TestPath(unittest.TestCase):
@mock.patch('os.path.isdir', return_value=False)
def test_path_is_not_dir(self, mocked_isdir):
with self.assertRaises(ValueError, msg="message 1"):
inst = MyClass()
inst.get_path(path="foo")
@mock.patch('os.path.isdir', return_value=True)
@mock.patch('os.access', return_value=False)
def test_path_not_accessible(self, mocked_access, mocked_isdir):
with self.assertRaises(ValueError, msg="msg2"):
inst = MyClass()
inst.get_path(path="foo")
@mock.patch('os.path.isdir', return_value=True)
@mock.patch('os.access', return_value=True)
def test_valid_path(self, mocked_access, mocked_isdir):
inst = MyClass()
inst.get_path(path="foo")
self.assertEqual("foo", inst.path)
这样您就可以测试功能而无需提供任何真实文件。
除此之外,将参数解析功能与测试代码中的测试功能分开是有意义的。
推荐阅读
- python - python - 如何将 C 函数实现为可等待(协程)
- sql - 基于另一个表的 Microsoft Access 多条件
- javascript - 如何用颜色突出显示单词?
- python - @classmethod 的参数在 Python 文档中的作用是什么?
- odata - SAPUI5 oData 错误!FK 80 - RFC 错误:结束日期 xx.xx.xxxx 早于开始日期 yy.yy.yyyy
- python - 使用 Flask 对 json 数据进行分页
- javascript - 为动画添加重力
- firebase - 模拟器工作时客户端权限不足
- swift - 视图控制器中没有显示导航栏或任何导航栏属性
- sql-server - 提高 SQL Server 2012 的 UPDATE/DELETE 性能