Linq to SQL を使用するコードの単体テストはどのように行われますか
-
09-06-2019 - |
質問
Linq to SQL を使用するコードの単体テストはどのように行われますか?
解決
アップデート:
Fredrik は、linq2sql アプリケーションの単体テストを行う方法に関するソリューション例をブログに公開しています。次の場所からダウンロードできます。
彼がサンプル ソリューションを投稿しただけでなく、すべてのクラスのインターフェイスを抽出することに成功したことは素晴らしいことだと思います。これにより、設計がより分離されました。
私の古い投稿:
*DataContext ラッパーの作成に適していると思われる次のブログを見つけました。リンク1 リンク2
これらは、最初のトピックがテーブルのインターフェイスを抽出する手段も実装していることを除いて、ほぼ同じトピックをカバーしています。ただし、2 番目のものはより広範であるため、それも含めました。*
他のヒント
3年遅れましたが、私のやり方は次のとおりです。
https://github.com/lukesampson/LinqToSQL-test-extensions/
ラッパーを書いたり、多くの作業を行う必要はありません。T4 テンプレートを .dbml の隣にドロップするだけで、次の結果が得られます。
- データコンテキストのインターフェース。IExampleDataContext
- データコンテキストのメモリ内モック。メモリ例データコンテキスト
どちらも、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 をラップしてから、ラッパーをモックします。これはテストを行うための最も速い方法ですが、テスト用のコーディングが必要で、臭いと思う人もいます。ただし、(簡単に) モックできない依存関係がある場合、それが唯一の方法である場合があります。
Linq を使用すると、テストがはるかに簡単になります。Linq クエリは、Linq-to-SQL のものと同様にリストでも機能します。リスト オブジェクトに対して Linq to SQL を交換し、その方法でテストできます。
マトワールは終わりました わがままなウェブログ 拡張可能な Linq2Sql データ コンテキストをモックアップする方法に関する素晴らしい記事がありました。それをチェックしてください - NIX のモック - 拡張可能な LINQ TO SQL データコンテキスト
通常、LINQ to SQL を使用するコード部分をテストする必要はありませんが、実際にテストしたい場合は、サーバーに対してクエリを実行しているのと同じデータ セットを使用して、それらをメモリ内オブジェクトに変換し、それに対して LINQ クエリを実行します (Queryable の代わりに Enumerable メソッドが使用されます)。
もう 1 つのオプションは、Matt Warren のツールを使用することです。 DataContext のモック可能なバージョン.
LINQ to SQL が使用する SQL ステートメントをデバッガー経由で (IQueryable オブジェクトから) 取得し、手動で確認して、自動テストに含めることもできます。
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