![](/img/trans.png)
[英]Unit Test Failing with Moq and xUnit - 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.