2012-10-25 2 views
6

: -SQLデータベースに接続せずに、指定した式をSQL *に変換できるかどうかをテストできますか?たとえば

// This one will be converted to SQL no problem 
Expression<Func<Foo, bool>> predicate = x => x.Name = "Foo"; 

// This one will throw a NotSupportedException because the QueryProvider 
// doesn't support reference comparisons 
Expression<Func<Foo, bool>> predicate = x => x == someOtherFoo; 

// This one doesn't work because the query provider can't 
// handle IsAwesome() 
Expression<Func<Foo, bool>> predicate = x => x.IsAwesome(); 

私は、理想的にはデータベースから分離された自動テストでは、実行時前にこれをテストする方法を探しています。

私は自分のQueryProviderをインスタンス化する方法を見つけようとしているのに、MSDNを使って何度かトロールしていましたが、私のGoogle-fuは今日私にはうんざりです。

ありがとうございます!

答えて

4

これを行うにはモデルが必要ですが、データベースは必要ありません。モデルをEDMXとして作成できますが、おそらくコードファーストを使用する方が簡単です。コードファーストモデルの作成または使用にデータベース接続が必要ないことを保証するために、コードファーストがデータベースから通常取得するいくつかの情報を提供する必要があります。この投稿http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/は、これを行うためのDbModelBuilderの使い方と、モデルからDbContextを作成する方法を示しています。次のようなコードで終了します:

モデルオブジェクトを別のテストごとに再度作成するのではなく、キャッシュすることをお勧めします。

DbContextがデータベースに接続しようとするのを防ぐには、データベースイニシャライザも無効にする必要があります。たとえば、コンテキストを使用する前に、このような呼び出します

Database.SetInitializer<FooContext>(null); 

を今、あなたはちょうどそれが生成されますどのようなSQLを参照するために、任意のクエリにToStringメソッドを使用することができます。 LINQが式を処理できない場合、例外が発生します。これがスローされます

using (var context = new FooContext(model)) 
{ 
    Expression<Func<Foo, bool>> predicate = x => x.Name == "Foo"; 

    Console.WriteLine(context.Foos.Where(predicate)); 
} 

using (var context = new FooContext(model)) 
{ 
    var someOtherFoo = new Foo(); 
    Expression<Func<Foo, bool>> predicate = x => x == someOtherFoo; 

    Console.WriteLine(context.Foos.Where(predicate)); 
} 

を明らかにあなたはあなただけのコンソールに印刷されることはありませんテストを書くのではなく、いくつかの種類を実行している場合たとえば、このクエリを出力しますアサーション/チェックの

+0

完璧、ありがとう! –

関連する問題