私たちは、 Effort.EF6を使用して、メモリ内のデータベースに対して動作するASP.NET Web API 2サービス用のテストスイートを構築しています。その大部分はすばらしい経験です。
しかし、この質問とは無関係の理由から、EF6で(DBコンテキストのコンストラクタでConfiguration.LazyLoadingEnabled = false;
実行することによって)遅延ロードをオフにする必要がConfiguration.LazyLoadingEnabled = false;
ましたConfiguration.LazyLoadingEnabled = false;
つまり、 .Include()
どこかで使用した後、 NullReferenceExceptions
を取得します。テストでは、これらのタイプのエラーをキャッチすることができます。
私たちのテストのセットアップは、基本的に以下の通りです:
問題は、テストセットアップ中のコンテキストに追加したものは、テスト対象のコードが実行されているときに既にロードされているように見えるので、Effort.EF6を遅延ロードを許可しないように設定する方法はわかりません。例外を参照してください。これは、テストセットアップと実際のコード実行の間にコンテキストインスタンスを再利用しているためです。
3つ目のステップを次のように切り替えると、
代わりに空の DBコンテキストになります。つまり、テストを実行する前にいくつかのデータポイントを追加しても、データはありません。
Effortを使用してdbコンテキストを構築して注入するにはどうすればいいですか.Include()
ステートメントがない場合は失敗しますが、 .Include()
場合は.Include()
ますか?
Effort.EF6のコンストラクタでも、 DbConnection
オブジェクトを使用するコンストラクタでそれを無効にする必要がDbConnection
ます。
私は以下のようなEF Code Firstプロジェクトのためにそれを解決しました:
public class MyDataContext : DbContext, IMyDataContext
{
/*
* the ohter stuff like IDbSet<T> etc.
*/
public MyDataContext() : base("name=MyConnectionString")
{
Configure();
}
/// <summary>
/// This constructor is for test usage only!
/// </summary>
/// <param name="connection">Test connection for in memory database</param>
public MyDataContext(DbConnection connection) : base(connection, true)
{
Configure();
}
/// <summary>
/// Configures the data context.
/// </summary>
private void Configure()
{
Configuration.LazyLoadingEnabled = false;
}
}
さらに私のテストプロジェクトでは、テスト用のCSVファイルを設定しています。このファイルは、Effort.EF6によって使用され、シードされたデータでコンテキストをインスタンス化します。私のケースでは、特定のファイルを持つ特定のテーブルをシードする可能性を与える小さなTestDataManagerを作成しました。
Effort.EF6でデータをシードできるコードの例を次に示します。
IDataLoader loader = new CsvDataLoader(@"C:\Temp\Test_CSV_Files");
DbConnection dbConnection = DbConnectionFactory.CreateTransient(loader);
var myDataContext = new MyDataContext(dbConnection);
多分このブログの投稿があなたを助けるかもしれません。