私はサービスのテスト自動化に取り組んでいて、いくつかの一般的なセットアップ&検証を 'セッション'クラスにロールアップするうまい方法を考え出しました。私は等の役割ごとに適切な認証をテストしていたサービスへの接続を設定Sessionオブジェクトのコンストラクタで例外が既にスローされているかどうかを確認するにはどうすればよいですか?
using (var managerSession = new Session(managerRole))
{
// A manager puts some items in warehouse
}
using (var employeeSession = new Session(employeeRole))
{
// An employee moves items from warehouse to store
}
using (var customerSession = new Session(customerRole))
{
// A customer can buy items from the store
}
を、そしてセッション廃棄で:
概念的には、テストケースは次のようになります。 ()メソッドセッションのライフタイム中にサーバー側のエラーや警告が発生していないかどうかをチェックする共通の検証ブロックがあります。
もちろん、これはIDisposeパターンを悪用しています。使用ブロック内のテストコードが例外をスローし、検証ブロックも例外をスローすると、2番目の例外が最初にマスクされます。概念的に
、私たちはこのシナリオがある場合:
using (var managerSession = new Session(managerRole))
{
Assert.IsTrue(managerSession.DoJob(), "Manager did not do his job");
}
を...とアサートが失敗したかmanagerSession.DoJob()の呼び出しが例外をスローし、その後、私はセッションのDispose()メソッドをしたいと思います検証ブロックをスキップし、すなわち
public void Dispose()
{
if (NoExceptionThrown())
{
Assert.IsFalse(this.serviceConnection.HasErrors(), "Service connection has errors");
}
this.serviceConnection.Dispose();
}
...それは実際に失敗した場合の試験方法は、「サービスの接続にエラーがある」で失敗したことがないというような「マネージャー彼の仕事をしませんでした」
私の質問です:ここで 'NoExceptionThrown()'メソッドを実装することは可能ですか?チェックすることができるいくつかのグローバルプロパティ、またはThread.CurrentThreadで隠されているものが利用できますか?
更新:
私の質問は、私はもちろんの代わりにこのパターンを使用することができ、この:-)に
をリファクタリングする方法ないです:静的メソッドForRole(有
Session.ForRole(managerRole, (session) => { /* Test code here */ });
を)同様に定義される。
public static void ForRole(Role r, Action<Session> code)
{
var session = new Session(r);
try
{
code(session);
Assert.IsFalse(session.serviceConnection.HasErrors());
}
finally
{
session.Dispose();
}
}
しかし、上記のように例外状態を取得する方法があるかどうか不思議です。
2つのもの。まず、はい、これは 'IDisposable'を乱用しています。 「IDisposable」を使用して、「できるだけ早く解放すべき管理されていないリソースを所有しています。何かを意味すると、コードを読みにくくします。第二に、あなたは* any * exception、またはuncaught * exceptionsのみを心配していますか?テストコードが例外をスローし、キャッチして正常に完了したとします。それにフラグを立てるべきでしょうか? –
ああ、私は_uncaught_例外についてのみ心配しています。私は質問を更新します... – Christoffer
乱用IDisposableについて:私は実際には、エラーの潜在的なマスキングよりも各セッションの共通の検証が欠落していることを心配しています。実際のテストコードブロックは10〜100行のUIオートメーションコードであり、ブロックの1つで妥当性検査ステップの1つが欠落している(または誤ったブロックで報告されている)ため、検出されなかった欠陥を既に検出しています。 – Christoffer