[英]How do I unittest python method that accesses a database?
def insert_env(self, env):
"""Inserts a new environment into ENV_TABLE
Keyword arguments:
env -- name of environment to be inserted
"""
info = {}
# populate info dictionary
sql = (
"""INSERT INTO my_table (...) VALUES (...)""")
try:
DML(sql, info)
except oracleException as e:
logger.debug('dml {0} resulted in error {1}'.format(sql, e))
在这里,我有一个函数,该函数可填充info
字典并将值插入数据库的表中。 DML
是另一个函数的帮助方法,该函数已经存在了一段时间,并且可以调用oracle数据库,而大多数数据库信息已经在该函数中进行了硬编码。 如何对该功能进行单元测试? 我无法模拟数据库,因为辅助函数已硬编码访问我们的生产数据库。
帮助功能DML
不属于您要测试的单元; 嘲笑它 。 显然,您需要在insert_env
进行测试的唯一事情是,使用适当的参数调用DML
,并且如果DML
引发异常,则使用记录器。
在调用DML
之后, info
( insert_env
的局部变量)不再被使用的事实表明这不是完整的功能。 可能还有更多要测试的内容,但是无法根据给出的信息进行测试。
首先,最好在第二个文件中使sql字符串成为全局常量。 然后模拟数据库调用。
# Need to test exception scenario
class oracleExceptionStub(oracleException):
# bypass constructor
def __init__(self):
pass
class Test...(unittest.Testcase):
@mock.patch('path_to_DML')
def test_insert_valid(self, mock_dml):
test_env = ...
expected_info = ...
insert_env(test_env)
mock_dml.assert_called_once_with(sql_contant, expected_info)
@mock.patch('logger.debug')
@mock.patch('path_to_DML', side_effect=oracleExceptionStub)
def test_insert_invalid(self, mock_dml, mock_logger):
insert_env(..., ...)
self.assertTrue(mock_logger.called)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.