簡體   English   中英

如何單元測試實體框架?

[英]How to unit test Entity Framework?

我試圖首先使用EntityFramework代碼測試我的代碼。 為了使其可測試並允許隔離測試,我創建了一個我的DbContext實現的接口。 我沒有測試DbContext類 - 我將假設EF代碼按預期工作。

現在,請考慮以下方法:

public IEnumerable<User> GetOddId()
{
    return context_.Users.Where((u, i) => i % 2 == 1).AsEnumerable();
}

這個方法將通過我的模擬FakeDbSet (因為它將使用內存中的LINQ提供程序),而在使用EF / LINQ to SQL驅動程序時它會因異常而失敗。

你會不會留下它並希望人們知道不要寫這樣的問題? 你會放棄隔離測試並測試實際的數據庫嗎?

具有DataMigrations的LocalDb(可能帶有適當的種子)是否有助於對實際數據庫進行測試?

請證明答案是正確的。

TLDR:如何測試EntityFramework代碼,考慮內存LINQ和SQL LINQ之間的差異?

很久以后編輯:我發現了一個非常好的框架,完全符合我的需要。 我寫了一篇關於使用Effort進行單元測試的博客文章。 另請注意,即將推出的EF6可能不需要這一切,它承諾了一些單元測試功能。

為此,我們使用SQLite的內存數據庫。 它們可以非常快速地創建,查詢和拆除,並且幾乎不會對整體測試速度產生任何影響。 一旦你為自己設置了一個測試框架來創建數據庫並注入數據,測試就可以快速編寫。

當然,SQLite是一個比大多數人簡單得多的數據庫,因此復雜的查詢可能無法轉換為其SQL版本,但是為了測試90%的情況,它運行良好。

這些測試是否構成集成測試? 我不這么認為。 他們仍然只測試代碼一個單位,即比特生成LINQ查詢。 您正在測試兩件事: 1)查詢返回正確的數據(但您可以使用內存中的集合檢查這一點),以及2)查詢可以由Entity Framework轉換為有效的SQL。 測試后者的唯一真正方法是在真實的實體框架中使用存根數據庫觸發查詢。

雖然你可以說真正的單元測試應該只測試代碼的輸出(即解析並檢查已經生成的表達式樹),以及更難寫,但它並沒有真正證明什么。 例如,如果您修改代碼以生成內部聯接而不是子查詢,您是否希望測試中斷? 只有當它返回不同的結果時,我才會想到。

在我工作的地方,我們有一個dev / beta / production SQL服務器。 有時我們會在對實際數據庫執行測試之前,針對beta和種子測試數據(例如在測試特定選擇之前插入等)創建測試。 人們將區分單元測試和集成測試,但它至少讓我們測試我們的邏輯,這比僅僅交叉指向並希望在數據訪問層最好。

內存提供程序有什么用,它很容易測試但在某些重要情況下實際上並不代表實時系統?

編輯:我們不使用EF,順便說一下......

您可能想要使用像Telerik的JustMock這樣的模擬框架(或從許多其他人中選擇)。

這將使您可以控制測試代碼中發生的事情。 此處簡短介紹。)

您可以“模擬”查詢並返回預定義的對象集合,而不是對真實數據庫實施查詢。

例如,您可以創建多個調用GetOddId()方法的單元測試,並定義覆蓋所有測試用例的不同返回集合(空列表,正確內容,錯誤內容,拋出異常,等等,... )。

這里或通過NuGet還有一個免費的'Lite'版本。

暫無
暫無

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

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