Entity Framework を使用して構築されたエンティティをテストしたいと考えています。私の懸念は、Entity Framework を使用するということは、データ ソースを直接操作することを意味するということです。Entity Framework ベースのコンポーネントを単体テストする方法はありますか?
13 に答える
Enity Framework 4 の場合、これは有望に見えます: Testability and Entity Framework 4.0
どうやらとても大変そうです。ここでエリックが雄弁に述べた - TDD and ADO.NET Entity Framework
安価なアプローチは、実際のデータベースと同じ構造のデータベースファイルを設定し、それを指すように単体テスト構成の接続文字列を設定することです。データベースには、実際のテーブルにあるすべてのテーブルが含まれている必要はありません。ユニットテストに必要なものだけです。
欠点は、単体テストが実行中および実行間で相互に影響を与えないように、データベースの状態を管理する必要があることです。
このアプローチは、実際のテストDBと単体テストDBの両方がSQL Expressを使用する場合に機能することは知っていますが、完全なSQLDBのSqlExpressDBでのスタブについてはわかりません。
これは技術的には統合テストであると思いますが、コードをリファクタリングしたり、モックフレームワークを学習したりするよりも安価な場合があります。
実際の接続文字列の例:
<add name="DrinksEntities"
connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient
;provider connection string="Data Source=localhost\sqlexpress;Initial Catalog=Drinks2;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework""
providerName="System.Data.EntityClient" />
接続文字列をテストするユニットの例:
<add name="DrinksEntities"
connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient
;provider connection string="Data Source=.\SQLEXPRESS;attachdbfilename=|DataDirectory|\Inventory.mdf;Integrated Security=True;user instance=True;MultipleActiveResultSets=True;Application Name=EntityFramework""
providerName="System.Data.EntityClient" />
これに対する別の意見を共有したいと思います。TypeMockIsolatorを使用してEntityFrameworkベースのコンポーネントとアプリケーションをテストすることもできました。しかしそれは商業的です。
この投稿をご覧ください: TypeMockIsolatorを使用したEntityFrameworkユニットテストの紹介
実際のデータにアクセスするのではなく、モッキング フレームワークを使用してモック値を取得する必要があります。いくつかのモック フレームワークのリストと、開始に役立つスクリーンキャストへのリンクを次に示します。
開始方法に関するいくつかのスクリーンキャストを次に示します。
Entity Framework のバージョン 1 はいくつかの主要なソフトウェア設計原則に違反しているため、アプリケーションで TDD を使用する場合に TDD を適用する方法は実際にはありません。私の調査では、即時の解決策を探している場合は NHibernate を指しています。単体テストを念頭に置いて設計されています。
ただし、待つことができれば、Entity Framework の次のリリースに希望があるようです: Entity Framework 4.0 を使用したテスト駆動開発のチュートリアル
例は非常に単純化されているかもしれませんが、私はまさにこの問題に対する可能な解決策について議論しようとしました. これには、懸念の分離と親愛なる友人の依存性注入が含まれます。
詳細が必要な場合は、私に連絡してください。
私は同意します、モッキングフレームワークはあなたが求めているものです。データソースから取得されない「モック」オブジェクトを作成し、そのオブジェクトのデータをテストします。私は個人的に Moq を使用してきましたが、気に入っています。Rhinomocks などもあります。
Entity Framework モデルをテストするためにインメモリ データベースを使用できます。詳細はこちら
これは、作業単位パターン + インメモリ データベース + 偽の EF dbContext を自動的に生成する t4 コード生成の集計です。
http://mockingcompetence.wordpress.com/2013/05/20/fakingefdatacontext/
現時点で実際の EF db 接続を正確に複製するには、いくつかの問題があります (無効な linq to EF クエリと FK 強制なし)。
ただし、単体テストをすばやく実行するためのメモリ内コンテキストを持つことは、TDD やその他の種類の単体テスト中心のアプローチを実行できるようにするためにほぼ不可欠です。
問題の詳細がわかり次第、上記のリンクに更新を投稿します。
WPF Application Framework (WAF)プロジェクトのBookLibraryサンプル アプリケーションは、Entity Framework ベースのアプリケーションを単体テストする方法を示しています。
モッキングフレームワークを使用するのはどうですか?モッキング フレームワークは、ビジネス ロジックをデータベースから隔離するのに役立つように思えます。