我有一個應用程序,其中包含使用Entity Framework 4.2 Code First和MySQL數據庫處理數據的方法。我正在嘗試找出爲這些方法編寫MSTest單元測試的好方法。例如:如何爲使用實體框架4.2的代碼編寫單元測試?
的DataModel:
public class User
{
public User() { }
[Key]
public int UserID { get; set; }
public string Role { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
}
業務層:
public class Bus
{
public bool UserIsInRole(int userID, string role)
{
using(var context = new AppDbContext())
{
User user = context.Users.SingleOrDefault(p => p.UserID == userID);
if (user == null)
return false;
return user.Roles.Split(',').Contains(role);
}
}
}
我想寫一組單元測試的UserIsInRole功能,但我想嘗試自己從隔離實際上必須讀取和寫入實際的數據庫,因爲我無法在測試之前保證其狀態。僅僅爲這個測試設置/拆除數據庫將需要很長時間。
我遇到過很多關於使用假DbContext的文章,比如here,here和here,但它們都似乎有一些優點和缺點。一羣人說,不應該針對EF編寫單元測試,並且這屬於集成測試,並且任何假的DbContext都不能像可接受測試的目的那樣表現得足夠真實。
我認爲這樣的代碼位於參數中間的某個位置。理想情況下,我想創建一組表示所需數據的臨時內存對象,而無需將其實際存儲到數據庫中。
你將如何更改上面寫的一組驗證UserIsInRole方法測試:
- 返回false如果用戶ID中不存在的用戶收集 。
- 如果用戶不包含 所需的角色,則返回false。
- 如果用戶具有所需的角色,則返回true。
請記住,這是一個簡單的例子,該代碼實際上可以包含任意複雜的多個查詢,所以我希望能找到的東西有點比更全面,比如說,每個查詢移動到這是一個虛函數由測試框架替換以返回預定義的用戶記錄。
這是我正在考慮的事情。它將允許任何代碼從數據源創建所需的任何查詢。我擔心的是,查詢可能與在Linq到Entities之間返回的數據以及Linq到對象的(我認爲)有什麼不同。您對結果查詢兼容性有任何經驗嗎?例如,編譯良好並且通過測試但不能抵抗真實數據(區分大小寫,不受支持的函數,空行爲,結果分組)的情況。顯然,無論如何,都需要一定程度的集成測試。 – 2012-02-22 20:19:59
我只是在我的代碼中嘗試了這種方法。但是,我使用的功能在IQueryable <>中不受支持,例如Create(),Add(),Remove()等。它看起來像我還需要爲每個實體創建某種接口,或者將這些移動到IAppDomain接口。 – 2012-02-22 21:07:49
@DanC - 你也可以公開IDbSet而不是IQueryable。這給你所有他的選擇,但允許你創建一個虛假的實現 – Polity 2012-02-23 02:07:28