[英]How to handle pyodbc error properly in a try-except statement
我想知道,我正在處理一個僅在數據庫路徑不正確時引發的異常,而正確引發該異常僅反映在對函數的測試通過或未通過中。 當前,當任何錯誤包含在err子句之外時,我的單元測試就會通過。
我懷疑我沒有正確構造try-except語句來捕獲正確的錯誤。 對於pyodbc,我專門嘗試捕獲一個稱為“ pyodbc.Error”的錯誤,但當前所有錯誤都會導致測試通過。
我希望測試失敗,除非引發的錯誤是except子句中指定的錯誤。 我不想進行“全部捕獲”嘗試。
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
except pyodbc.Error as err: # Only error I wanted passed for the test!
raise err
@mock.patch('directory1.script1.pyodbc.connect')
def test_invalid_path_to_database(self, mock_conn):
mock_conn.side_effect = pyodbc.Error
# Passes no matter what exception is included in except clause!
self.assertRaises(pyodbc.Error, get_database)
這是一個工作示例,似乎捕獲了非pyodbc.Error
錯誤。 您能說明您要做什么嗎?
import pyodbc
import unittest
import mock
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
except pyodbc.Error as err: # Only error I wanted passed for the test!
raise ValueError('Non pyodbc error')
class Test(unittest.TestCase):
@mock.patch('pyodbc.connect')
def test_invalid_path_to_database(self, mock_conn):
mock_conn.side_effect = pyodbc.Error
self.assertRaises(pyodbc.Error, get_database)
if __name__ == '__main__':
unittest.main()
帶輸出
Traceback (most recent call last):
File "/Users/henry/projects/stack/.venv/lib/python3.7/site-packages/mock/mock.py", line 1305, in patched
return func(*args, **keywargs)
File "example.py", line 21, in test_invalid_path_to_database
self.assertRaises(pyodbc.Error, get_database)
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 743, in assertRaises
return context.handle('assertRaises', args, kwargs)
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 178, in handle
callable_obj(*args, **kwargs)
File "example.py", line 13, in get_database
raise ValueError('Non pyodbc error')
ValueError: Non pyodbc error
----------------------------------------------------------------------
Ran 1 test in 0.002s
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.