3

私の状況

ASP.NET MVC4 アプリケーションにテストを入れています。私が開発しているアプリの一部は、最新の WebSecurity/SimpleMembershipProvider と段階的に廃止されているレガシー認証システムを組み合わせています。これについて適切な単体テストを行いたいと思っていますが、実際的な理由から、WebSecurity をモックまたはスタブアウトしないことを選択しています。私はそれをテストデータベースに向けているだけです。*

問題:

WebSecurity.InitializeDatabaseConnection()NUnit を使用して、メソッドを使用して、一連のテスト用に WebSecurity をセットアップしたいと考えています。このメソッドは、できればアプリの起動時に 1 回だけ実行するように設計されています。

InitializeDatabaseConnectionテストを分離し、データベースを消去して、各テストの前に (つまり、[Setup]メソッド内で)呼び出したいと思います。ただし、WebSecurity は Initialized 状態を静的に維持します。つまり、同じアプリ インスタンスで複数回実行されると、例外がスローされます。

つまり、最初のテストだけが機能します。後続のものは例外をスローします。

System.InvalidOperationException : The "WebSecurity.InitializeDatabaseConnection" method can be called only once.

質問:

1 つのアプリ インスタンスで複数回初期化できるように、WebSecurity を「初期化解除」する方法はありますか? あるいは、NUnit が特定のフィクスチャで各テストの前にアプリを再起動する必要があることを示す方法はありますか?

ノート:

メソッドまたは aWebSecurity.InitializeDatabaseConnection()で 1 回呼び出すだけで、テスト間で関連するテーブルを消去するだけでしたが、クリーンな状態を保証することを本当に望んでいます。さらに、このアプローチには残念な副作用があります。NUnit GUI を使用していくつかのテストを順番に実行し、さらにいくつかのテストを順番に実行したい場合、シーケンス間でアセンブリをリロードする必要があります。GUI はこれらのセットアップ メソッドをテスト シーケンスごとに 1 回実行しますが、アセンブリがリロードされるまで同じアプリ インスタンスを維持しているようです。[TestFixtureSetup][SetUpFixture]


* 結局、私は WebSecurity をモックすることにしました。以下の私の自己回答を参照してください。

4

1 に答える 1

2

私は、WebSecurity をモックしたりスタブアウトしたりしないことを選択していると言いましたが、それがこの問題の可能な解決策です。WebSecurity の静的メソッドを正しく呼び出す代わりに、WebSecurity のメソッドを呼び出すインスタンス メソッドを持つ WebSecurityWrapper という名前のクラスを作成できます。

その後、単体テストは、希望どおりに動作するモック WebSecurityWrapper ( moqで作成) を渡すことができます。静的クラスをモックしようとしても問題ありません (WebSecurityWrapper は非静的であるため)。SimpleMembership 用のデータベースをセットアップする必要はありません。

FormsAuthentication Cookie に関連する追加の問題に遭遇し、より良い回答が得られなかったので、このモック アプローチを使用して先に進むことにしました。

于 2013-01-18T20:19:04.767 に答える