[英]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.