使用Effort.EF6測試預加載方案

c# effort entity-framework unit-testing

我們正在使用Effort.EF6來構建針對內存數據庫的ASP.NET Web API 2服務的測試套件,並且在很大程度上它是一種美妙的體驗。

但是,由於與此問題無關的原因,我們不得不關閉EF6中的延遲加載(通過運行Configuration.LazyLoadingEnabled = false;在db上下文的構造函數中),這意味著如果我們忘記.Include()關係某處,後來使用它,我們得到NullReferenceExceptions 。我們希望我們的測試可以捕獲這些類型的錯誤。

我們的測試設置基本如下:

  1. 使用Effort的連接工廠創建數據庫連接。每次測試時,這是一個唯一的連接實例(當我們嘗試使用持久連接時使用唯一鍵)。
  2. 使用該連接創建數據庫上下文,並添加我們想要存在的數據以進行測試。
  3. 在數據庫上下文的DI容器中註冊服務覆蓋。

問題是我們無法弄清楚如何配置Effort.EF6以禁止延遲加載,因為我們在測試設置中添加到上下文中的任何內容似乎已經在測試中的代碼運行時加載,因此我們從不看例外。我們假設這是因為我們在測試設置和實際代碼執行之間重用了上下文實例。

如果我們嘗試將第三步切換到以下步驟:

  1. 在DI容器中為數據庫連接註冊服務覆蓋。
  2. DI容器創建一個db上下文實例(將db連接作為註入依賴項)

我們最終得到一個空的 db上下文,即儘管我們在運行測試之前添加了一些數據點但它沒有數據。

我們如何使用Effort構造和注入db上下文,如果缺少.Include()語句,它將失敗但是如果它存在則會工作?

一般承認的答案

您必須在Effort.EF6的構造函數中停用它 - 獲取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合法嗎? 是的,了解原因