Effort.EF6によるeager-loadingシナリオのテスト

c# effort entity-framework unit-testing

質問

私たちは、 Effort.EF6を使用して、メモリ内のデータベースに対して動作するASP.NET Web API 2サービス用のテストスイートを構築しています。その大部分はすばらしい経験です。

しかし、この質問とは無関係の理由から、EF6で(DBコンテキストのコンストラクタでConfiguration.LazyLoadingEnabled = false;実行することによって)遅延ロードをオフにする必要がConfiguration.LazyLoadingEnabled = false;ましたConfiguration.LazyLoadingEnabled = false;つまり、 .Include()どこかで使用した後、 NullReferenceExceptionsを取得します。テストでは、これらのタイプのエラーをキャッチすることができます。

私たちのテストのセットアップは、基本的に以下の通りです:

  1. Effortの接続ファクトリを使用してdb接続を作成します。これは、テストごとに固有の接続インスタンス(永続的な接続を試みるときに一意のキーを持つ)です。
  2. その接続でdbコンテキストを作成し、テスト用に存在させるデータを追加します。
  3. DIコンテナにdbコンテキスト用のサービスオーバーライドを登録します。

問題は、テストセットアップ中のコンテキストに追加したものは、テスト対象のコードが実行されているときに既にロードされているように見えるので、Effort.EF6を遅延ロードを許可しないように設定する方法はわかりません。例外を参照してください。これは、テストセットアップと実際のコード実行の間にコンテキストインスタンスを再利用しているためです。

3つ目のステップを次のように切り替えると、

  1. dbコンテナのDIコンテナにサービスオーバーライドを登録します。
  2. DIコンテナはdbコンテキストインスタンスを作成します(db接続を注入された依存関係として扱います)

代わりに空の 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でデータをシードできるコードの例を次に示します。

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;
    }
}

多分このブログの投稿があなたを助けるかもしれません。




ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ