簡體   English   中英

使用 Try 和 except 時如何對 Python 中的錯誤進行單元測試

[英]How to Unit Test errors in Python when using Try and 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
    # 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子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM