簡體   English   中英

為單元測試目的實例化沒有數據庫連接的空實體模型

[英]Instantiating an empty Entity Model without a DB connection for Unit Testing purposes

我想為一個方法編寫一些單元測試。 但是,該方法引用了我的實體框架。 這是我想要測試的方法的一個非常人為的例子:

public int GetNumberWithName(string name, NWRevalDatabaseEntities entities)
{
    int number = (from n in entities.TableOfNumbers
                    where n.Name == name
                    select n).First();

    return number;
}

問題:

有沒有辦法在我的測試類中實例化NWRevalDatabaseEntities對象而不給它一個可行的數據庫連接 ,所以所有的表都是空的,然后只插入測試所需的實體,並且永遠不會將它們持久化到數據庫中?

NWRevalDatabaseEntities的商店是一個SQLite數據庫,可用的自動生成的構造函數是:

/// <summary>
/// Initializes a new NWRevalDatabaseEntities object using the connection string found in the 'NWRevalDatabaseEntities' section of the application configuration file.
/// </summary>
public NWRevalDatabaseEntities() : base("name=NWRevalDatabaseEntities", "NWRevalDatabaseEntities")
{
    this.ContextOptions.LazyLoadingEnabled = true;
    OnContextCreated();
}

/// <summary>
/// Initialize a new NWRevalDatabaseEntities object.
/// </summary>
public NWRevalDatabaseEntities(string connectionString) : base(connectionString, "NWRevalDatabaseEntities")
{
    this.ContextOptions.LazyLoadingEnabled = true;
    OnContextCreated();
}

/// <summary>
/// Initialize a new NWRevalDatabaseEntities object.
/// </summary>
public NWRevalDatabaseEntities(EntityConnection connection) : base(connection, "NWRevalDatabaseEntities")
{
    this.ContextOptions.LazyLoadingEnabled = true;
    OnContextCreated();
}

所有這些都需要連接或連接字符串(或使用存儲的連接字符串)。

如果無法做到這一點,我將研究創建一個內存中的SQLite數據庫,然后將該連接提供給NWRevalDatabaseEntities構造函數。 但是,這似乎會慢得多(因為它會影響數據庫引擎)並且單元測試應該很快,並且還需要我將數據庫定義代碼放入我的應用程序中,以前不需要它。

我知道用實體框架測試任何東西通常都是集成測試,而不是單元測試。 但是,這些測試並沒有真正測試集成 - 數據庫查詢非常簡單,並且可能也反對數組 - 我只想檢查我的方法是否正確選擇了查詢。

有沒有辦法在我的測試類中實例化NWRevalDatabaseEntities對象而不給它一個可行的數據庫連接,所以所有的表都是空的,然后只插入測試所需的實體,並且永遠不會將它們持久化到數據庫中?

沒有。

但是,這似乎會慢得多(因為它會影響數據庫引擎)並且單元測試應該很快,並且還需要我將數據庫定義代碼放入我的應用程序中,以前不需要它。

但是你的方法依賴於EF,所以你應該測試它與EF = with database一起工作。

我知道用實體框架測試任何東西通常都是集成測試,而不是單元測試。 但是,這些測試並沒有真正測試集成 - 數據庫查詢非常簡單,並且可能也反對數組 - 我只想檢查我的方法是否正確選擇了查詢。

簡單與否,它是使用Linq-to-entities的數據庫查詢。 它不是使用Linq-to-objects的數組查詢。 這個查詢也非常簡單: entities.TableOfNumbers.Last() - 它適用於數組,但不適用於EF。 如果您不想測試查詢,請將其與要測試的方法分開:

public int GetNumberWithName(string name, NWRevalDatabaseEntities entities)
{
    int number = ExecuteQuery(entities, Name);
    return number;
}

現在您只需要找到如何替換ExecuteQuery方法進行測試。 您可以將其protected virtual並覆蓋它以進行測試,因為您要測試的唯一事情是它接收正確的Name參數,並且您的GetNumberWithName返回從ExecuteQuery接收的相同數字。

現在,您只需要為ExecuteQuery編寫集成測試,以驗證Linq查詢是否適用於EF。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM