2012-03-23 32 views
4

最近我一直在進行大量的單元測試。引起我一個問題的一件事是查詢內存列表(通過模擬我的存儲庫)和通過實體框架直接查詢數據庫之間的區別。在單元測試中模擬數據庫/實體框架和內存列表之間的差異

有些情況可能是:

  1. 測試這將在內存中的集合,進而導致錯誤區分對數據庫不敏感,但區分大小寫 針對過濾參數失敗。

  2. Linq的語句可能會通過對一個在內存中集合,但將無法針對實體框架,因爲他們arent支持導致假合格。

什麼是正確的方式來處理或解決這些差異,以便沒有錯誤的通行證或測試失敗?我真的很喜歡嘲笑,因爲它讓事情變得更快,更容易測試。但在我看來,獲得真正準確測試的唯一方法是僅針對實體框架/數據庫環境進行測試。

回答

2

除此之外,您還做你也應該創造出對一個真正的數據庫設置爲運行在生產中遇到的集成測試單元測試。

我不是EF的專家,但以NHibernate爲例,您可以創建一個配置,指向SQLite的內存中實例,然後在其中運行快速測試(例如,在開發週期中,您希望儘可能快地通過測試套件)。當你想要針對真實數據庫運行集成測試時,只需將NHibernate配置更改爲指向真實的數據庫設置並再次運行相同的測試。

將是令人吃驚,如果你不能達到與EF類似的東西。

+0

這是否意味着再次複製所有相同的測試(僅使用數據庫代替)?看來這將涉及很多工作和重複。那時我爲什麼要嘲笑,而不僅僅是通過針對數據庫寫測試來殺死兩隻鳥? – computrius 2012-03-23 22:55:49

+0

@computrius:我更新了我的答案 – ChrisWue 2012-03-23 23:02:17

0

您可以使用DevMagicFake,這一框架將假的DB你也可以產生數據,因此可以無需測試DB

測試你的應用
0

首先也是最重要的是,你可以在你的模擬中定義的任何行爲數據。其次是速度。從單元測試角度測試速度計數。數據庫連接大部分時間都是瓶頸,所以這就是爲什麼你用測試來嘲弄它的原因。 要正確實施測試,您需要首先處理整個拱門。 例如訪問數據層我有時會使用存儲庫模式。這在Eric Evans DDD書中描述得非常好。 所以我們可以說,如果你的資料​​庫的定義如下 接口IRepository:IQueryable的,ICollection的 可以處理LINQ查詢非常簡單。 進一步閱讀Repository

0

我會讓我的模擬更細化,以便您實際上不會在模擬存儲庫中對較大的集合進行查詢。 我通常在我的模擬庫上有setter,我在每個測試中都設置了它來控制模擬庫的輸出。 這樣你就不必依賴針對通用模擬的查詢,而你的焦點可以放在測試被測方法的邏輯上

相關問題