Linq to SQL を使用するコードの単体テストはどのように行われますか?
7 に答える
アップデート:
Fredrik は、ブログで linq2sql アプリケーションの単体テストを行う方法のサンプル ソリューションを公開しています。次の場所からダウンロードできます。
彼がサンプル ソリューションを投稿したことは素晴らしいことだと思うだけでなく、すべてのクラスのインターフェイスを抽出することもできたので、設計がより分離されました。
私の古い投稿:
* DataContext ラッパーを作成するための良い出発点と思われるこれらのブログを見つけました: Link1 Link2
最初のトピックがテーブルのインターフェースを抽出する手段も実装していることを除いて、それらはほぼ同じトピックをカバーしています。2 つ目の方がより広範囲なので、それも含めました。*
3年遅れましたが、これが私のやり方です:
https://github.com/lukesampson/LinqToSQL-test-extensions/
ラッパーを作成したり、多くの配管を行う必要はありません。.dbml の横に T4 テンプレートをドロップするだけで、次のようになります。
- IExampleDataContext などのデータ コンテキストのインターフェイス
- データ コンテキストのインメモリ モック (MemoryExampleDataContext など)
どちらも、DBML で構成済みのマッピングを自動的に使用します。
だからあなたは次のようなことができます
public class ProductRepo {
IExampleDataContext DB { get; set };
public ProductRepo(IExampleDataContext db) {
DB = db;
}
public List<Product> GetProducts() {
return DB.Products.ToList();
}
}
そして、あなたはどちらかでそれを呼び出すことができます
new ProductRepo(new MemoryExampleDataContext()).GetProducts(); // for testing
また
new ProductRepo(new ExampleDataContext()).GetProducts(); // use the real DB
DataContext をラップしてから、ラッパーをモックします。テスト用のコーディングが必要ですが、臭うと考える人もいますが、これが最速の方法です。しかし、(簡単に) モックできない依存関係がある場合は、それが唯一の方法です。
The Wayward Web Log のMattwar には、拡張可能な Linq2Sql データ コンテキストをモックアップする方法に関する素晴らしい記事がありました。確認してください -- MOCKS NIX - AN EXTENSIBLE LINQ TO SQL DATACONTEXT
通常、LINQ to SQL を使用するコードの部分をテストする必要はありませんが、本当に必要な場合は、サーバーに対してクエリを実行しているのと同じデータ セットを使用して、それらをメモリ内オブジェクトに変換し、それに対して LINQ クエリを実行します (Queryable の代わりに Enumerable メソッドを使用します)。
もう 1 つのオプションは、Matt Warren のモック可能なバージョンの DataContextを使用することです。
また、LINQ to SQL が使用する SQL ステートメントをデバッガーを介して (IQueryable オブジェクトから) 取得し、手動でチェックしてから、自動テストに含めることもできます。
Linq を使用すると、テストがはるかに簡単になります。Linq クエリは、Linq-to-sql のものと同様にリストでも機能します。リスト オブジェクトの Linq を SQL に交換し、その方法でテストできます。
LINQ to SQLは、DBMLで定義されているものからその場でデータベースを作成する機能を備えているため、単体テストに非常に適しています。
DataContextを介してDBを作成し、最初は空にすることで、ORMレイヤーをテストするのは非常に便利です。
私はここで私のブログでそれをカバーしています:http://web.archive.org/web/20090526231317/http://www.aaron-powell.com/blog/may-2008/unit-testing-linq-to-sql。 aspx