2011-07-01 32 views
2

私はさまざまなビデオを見て、さまざまなブログを読んで、リポジトリの単体テストについて調べています。リポジトリをテストするユニットがありますか? Entity Framework 4.1

最も一般的なパターンは、実際のものと同じインターフェースを実装するFakeリポジトリを作成することです。次に、偽の人は内部の辞書などを使います。

実際には、実際には生産されないファクレポジトリのロジックをユニットテストしています。

IDBContextインターフェイスを使用して、モックDBContextを挿入するために依存性注入を使用することができます。しかし、実際にはdbcontext(嘲笑されている)に転送される各リポジトリメソッドをテストしているだけです。

したがって、それぞれのリポジトリメソッドがdbcontextを呼び出す前に多くのロジックを持っていなければ、それはちょっと意味がないようですね。

私は、統合テストとしてリポジトリのテストを行い、実際にデータベースにヒットしたほうがよいでしょうか?

新しいEF 4.1を使用すると、テストプロジェクトの接続文字列に基づいてオンザフライでデータベースを作成できるため、テストを実行した後にdbcontext.Databaseメソッドを使用してデータベースを削除することができます。

+0

私は同意します。ここではあまり言いたくないことはありません:) –

答えて

4

あなたの異論は部分的に正しいです。それらの正確さは、リポジトリの定義方法に依存します。

  • 最初の偽装または嘲笑リポジトリは、リポジトリ自体をテストするためではなく、リポジトリを使用してレイヤをテストするためのものです。
  • リポジトリがIQueryableを公開し、上位層がlinq-to-entitiesクエリを作成できる場合、リポジトリを非表示とすると既存のロジックをテストすることを意味します。統合テストが必要で、実際のテストデータベースに対してクエリを実行します。非常に遅くなるテストごとにデータベースを再デプロイするか、トランザクション内で各テストを実行し、テストが完了したらロールバックすることができます。
  • リポジトリにIQueryableが公開されていない場合でも、それをブラックボックスと見なして嘲笑することができます。クエリロジックはリポジトリ内にあり、統合テストで個別にテストされます。

repository itself and testingについてのその他の回答のセットを参照します。

0

私が見てきた最良のアプローチは、HPLnateマッピング情報に基づいてTestFixtureSetupで作成されたSQLLiteデータベースを使用するシャープアーキテクチャからです。

リポジトリテストでは、このインメモリデータベースが使用されます。

は、技術的にはこれはまだ関係するデータベースとして統合テストであるが、実際、それは以降のユニットテストのためにすべてのボックスを刻む:

1)データベースが一時的である - 何も接続文字列のconfigsは心配なく、また、あなたを行うには単体テストを使用するためにどこかのサーバーに座っている完全なデータベースが必要です。

2)セットアップは高速であり、テストはすべて同じようにメモリに格納されます。

3)NHibernateマッピング情報を使用してスキーマを生成するので、単体テストのセットアップをコードの変更と同期させることを心配する必要はありません。

http://wiki.sharparchitecture.net/default.aspx?AspxAutoDetectCookieSupport=1

EFと同じアプローチを使用することも可能です。

+0

興味深いですが、もう一度、そのテストで何かが実用にならないと思っています。テスト用にデータベースをローカルまたはビルドサーバー上に作成することを好みますが、これはEF 4.1を使用して簡単に実行されます。 – Mark

+0

単体テストが多く、生産には向かないテスト用のものです。 FixtureSetupプロセスを実行するたびに、ライブシステムの動作の模擬的なものが導入されます。しかし、バランスのとれた私は同意する - 私はまだセットアップの努力の価値があるこの性質のテストを発見していない。 – BonyT

関連する問題