我正在尝试对我的一个函数进行单元测试,以确保数据库连接有效,如果无效,则引发正确的异常。我很难测试是否引发了正确的异常数据库连接无效有效
我已经成功模拟了数据库连接,并在连接有效时得到了我想要的结果。然而,尽管测试成功,它肯定没有按预期工作。当我用特定错误模拟数据库连接并断言引发了另一个错误时,即使它们是不同的错误,测试仍然通过。有关详细信息,请参阅代码。
def get_database():
try:
conn = pyodbc.connect(
r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=M:\Path\To\Database\My_Database.accdb;'
)
return conn
# I want to assert this specific error is raised given bad connection
except pyodbc.Error as err:
raise err
@mock.patch('directory1.script1.pyodbc.connect')
def test_database_connection_error(self, mock_conn):
# If connection is valid test works as intended!
get_database()
mock_conn.assert_called_once_with((
r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=M:\Path\To\Database\My_Database.accdb;'
))
# This test still passes even though the errors are different!
mock_conn.side_effect = pyodbc.ProgrammingError
self.assertRaises(pyodbc.Error, get_database)
我希望如果模拟数据库连接设置为一种类型的错误并且断言另一种错误,那么测试应该会失败。事实并非如此。
最佳答案
pyodbc.ProgrammingError
是 pyodbc.DatabaseError
的子类,它是 pyodbc.Error
的子类,所以你的:
self.assertRaises(pyodbc.Error, get_database)
只要引发 pyodbc.Error
的子类的任何异常实例(包括 pyodbc.DatabaseError
),它就会通过。
您应该具体说明要捕获 pyodbc.Error
的哪个子类。
关于python - 使用 Try 和 Except 时如何在 Python 中单元测试错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55618606/