VisualStudio11ベータ版で遊んでいます。
このコードを考えると:
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の検証部分は明らかに例外をスローしており、デバッグするとスローされることがわかります。
testメソッドをasyncに変更し、構文をTask.Run(()=> Target.ExecuteNonQuery())を待機するように変更しました。
質問:
- ExecuteNonQueryは例外をスローしますか?
- ExecuteNonQueryFail1に例外が表示されないのはなぜですか?
- メソッドの非同期性を放棄することなく、例外を適切に処理してテストケースに合格するように、テストメソッドまたはメソッド自体を変更するにはどうすればよいですか?