12

Code First を使用して、クラスを既存のデータベースにマップしています。これらのマッピングを単体テストする方法が必要です。これらのマッピングは、規則ベース、属性ベース、および流暢な API が混在しています。

単体テストを行うには、クラスのプロパティがデータベース内の正しいテーブル名と列名にマップされていることを確認する必要があります。このテストはコンテキストに対して実行する必要があり、最初にコードのすべての構成オプションをカバーする必要があります。

非常に高いレベルで、(疑似コード) のようなものをアサートしようとしています。

Assert.IsTrue(context.TableFor<Widget>().IsNamed("tbl_Widget"));
Assert.IsTrue(context.ColumnFor<Widget>(w => w.Property).IsNamed("WidgetProperty"));
4

3 に答える 3

2

考慮すべきもう 1 つのアイデアは、Linq と ToString() を使用することです。

たとえば、これは次のとおりです。

context.Widget.Select(c => c.Property).ToString()

SQL Server Provider の場合は次のようになります。

"SELECT [Var_3].[WidgetProperty] AS [WidgetProperty] FROM [dbo].[Widget]..."

これで、結果の SQL を解析する拡張メソッドですべてを非表示にすることができます。これは、疑似コードのように見えます。

Assert.IsTrue(context.Widgets.GetSqlColumnNameFor(w => w.Property).IsNamed("WidgetProperty"));

延長案 :

public string GetSqlColumnNameFor<TSource>(this DbSet<T> source, Expression<Func<TSource, TResult>> selector)
{
    var sql = source.Select(selector).ToString();

    var columnName = sql... // TODO : Some regex parsing

    return 
       columnName;
}

同様に、GetSqlTableNameFor() を作成することもできます。

更新:私はいくつかの専用の SQL パーサーを探すことにしたので、このソリューションはより一般的です。明らかに .NET にはそのようなものがあります:

http://www.dpriver.com/blog/list-of-demos-illustrate-how-to-use-general-sql-parser/generate-internal-query-parse-tree-in-xml-for-further-処理/

于 2016-06-01T06:30:58.327 に答える
0

すべての可能なオプションをカバーするために私が考えることができる唯一の方法は、Entity Framework Power Tools を使用して DbContext のビューをプリコンパイルし、おそらくその生成された型のリフレクションと生成されたコード自体の RegEx の組み合わせを使用して、すべてが希望どおりにマップされていることを確認します。私にはかなり痛いように聞こえます。

頭に浮かぶもう 1 つのことは、DbModelBuilder の周りにファサードを作成して、それを通過するすべてのものをインターセプトしてチェックすることですが、それが規則ベースのものを処理するかどうかはわかりません。苦しそうにも聞こえます。

完全ではありませんが、はるかに簡単な代替手段として、可能な限り属性ベースのマッピングに切り替えることで、おそらくこれの大部分をノックアウトできます。これにより、ModelTesting<TEntity> などのベース テスト クラスを作成できます。このクラスには、リフレクションを使用して TEntity が次のものを持っていることを確認するいくつかのテスト メソッドが含まれています。

  • 単一の TableAttribute。
  • 各プロパティには、単一の ColumnAttribute または NotMappedAttribute があります。
  • KeyAttribute を持つ少なくとも 1 つのプロパティ。
  • 各プロパティ タイプは、互換性のあるデータベース タイプにマップされます。

プロパティとクラスの名前に基づいて命名規則を適用することもできます (階層ごとのテーブル タイプには注意が必要です)。外部キーのマッピングも確認できます。これは、モデル タイプごとに 1 回派生させて、間違いの大部分をキャッチできる、一度だけの基本クラスです (まあ、とにかく、私のミスの大部分はキャッチできます)。

TPH 継承など、属性で表現できないものは、少し難しくなります。DbContext を起動し、Set<TEntity>() で FirstOrDefault を実行する統合テストは、DbContext がデータベースを生成していないと仮定すると、おそらくこれらの基本のほとんどをカバーします。

于 2012-04-26T04:54:48.187 に答える