簡體   English   中英

單元測試在預期的InvalidOperationException上失敗

[英]Unit Test fails on expected InvalidOperationException

我已經編寫了單元測試來測試應用程序中的一些SQL操作。 這是測試:

[TestMethod]
[ExpectedExceptionAttribute(typeof(InvalidOperationException))]
public void ExecuteSQL_CommandInvalidSyntax_ThrowsException()
{
    var result = TestSqlHandler.ExecuteSQL(new List<int>
    {
        1, 2, 3, 4
    }, "Invalid command text");
}

有問題的方法:

public static Exception ExecuteSQL(List<int> walletList, string command)
{
    try
    {
        using (var conn = new SqlConnection("Omitted"))
        {
            if (conn.State == ConnectionState.Open)
                conn.Close();


            string sql = command;
            using (var cmd = new SqlCommand(sql, conn))
            {
                conn.Open();
                foreach (int row in walletList)
                {
                    cmd.Parameters.AddWithValue("@par1", row.ToString());
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
                conn.Close();
            }
        }
    }
    catch (Exception ex)
    {
        return ex;
    }
    return null;
}

但是,如果我更改方法以在返回值和InvalidOperationException上聲明相等,則此測試失敗,並且得到以下消息:

消息:Assert.AreEqual失敗。 Expected:System.InvalidOperationException:由於對象的當前狀態,操作無效。 Actual:System.InvalidOperationException:ExecuteNonQuery:CommandText屬性尚未初始化

我還將代碼復制到一個單獨的項目文件中,以確保所調用的方法返回InvalidOperationException,並且確實如此。 我想念什么?

你的方法返回一個例外,而不是拋出異常。 ExpectedExceptionAttribute期望您的方法拋出未處理的異常。 這行:

return ex;

返回異常。 相反,只需將其替換為

throw;

或完全刪除try / catch,因為除了重新拋出外,僅捕獲和執行其他操作與一開始就不捕獲相同。

我還要問函數返回Exception是否有意義。

public static Exception ExecuteSQL(List<int> walletList, string command)

那真的是您想要的,還是應該返回執行查詢的結果? 該函數應該返回您希望接收的內容,在這種情況下,可能是查詢的值或表明已執行的響應。 您不必返回異常。 如果拋出一個,它將自動冒泡至調用方法。 該方法可以處理它,或者如果不能處理,則冒泡到下一個方法,依此類推。


這也解釋了如果您將測試更改為斷言相等時會遇到的錯誤。 無論您期望的返回值是什么,都在檢查它是否等於Exception

暫無
暫無

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

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