我正在使用 Visual Studio 11 Beta。
鉴于此代码:
namespace KC.DataAccess.Global
{
/// <summary>Global methods for SQL access</summary>
public static class SQL
{
public async static void ExecuteNonQuery(string ConnStr, string Query)
{
if (string.IsNullOrEmpty(ConnStr)) throw new ArgumentNullException("ConnStr");
if (string.IsNullOrEmpty(Query)) throw new ArgumentNullException("Query");
SqlConnection conn = new SqlConnection(ConnStr);
SqlCommand cmd = PrepSqlConnection(ref conn, Query);
Exception exc = null;
for (int i = 0; i < 3; i++)
try { await Task.Run(() => cmd.ExecuteNonQuery()); break; }
catch (Exception ex) { Thread.Sleep(50); exc = ex; }
if (exc != null) throw new ApplicationException("Command failed after maximum attempts", exc);
conn.Close();
conn.Dispose();
}
}
}
由于它是一种异步方法,因此异常似乎不会冒泡到调用方法。我有因此失败的测试用例:
using Target = KC.DataAccess.Global.SQL;
[TestMethod]
[TestCategory("Unit")]
[ExpectedException(typeof(ArgumentNullException))]
public void ExecuteNonQueryFail1()
{
Target.ExecuteNonQuery(null, "select 1");
}
在这种情况下,ExecuteNonQuery 的验证部分显然会抛出异常,我在调试时看到它抛出异常。
我已将测试方法更改为 async 并将语法更改为await Task.Run(() => Target.ExecuteNonQuery()),但无济于事。
问题:
- ExecuteNonQuery 是否完全抛出异常?
- 为什么 ExecuteNonQueryFail1 没有看到异常?
- 如何更改测试方法或方法本身,以正确处理异常并通过测试用例,而不放弃方法的异步性质?