我正在通過Apress ASP.NET MVC 3 book,並試圖確保我爲所有可能的事情創建單元測試,但是花了一天的大部分時間試圖找出編輯不會保存的原因(請參見this SO question)我想爲此創建一個單元測試。設計一個類是單元測試
我曾指出,我需要創建下面的類單元測試:
public class EFProductRepository : IProductRepository {
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products {
get { return context.Products; }
}
public void SaveProduct(Product product) {
if (product.ProductID == 0) {
context.Products.Add(product);
}
context.SaveChanges();
}
public void DeleteProduct(Product product) {
context.Products.Remove(product);
context.SaveChanges();
}
}
public class EFDbContext : DbContext {
public DbSet<Product> Products { get; set; }
}
我使用Ninject.MVC3和起訂量,並創造了數個單元測試之前(而工作雖然前面提到的書),所以我正在慢慢地把頭轉過來。我已經(希望正確)創建的構造方法,使我在_context
經過:
public class EFProductRepository : IProductRepository {
private EFDbContext _context;
// constructor
public EFProductRepository(EFDbContext context) {
_context = context;
}
public IQueryable<Product> Products {
get { return _context.Products; }
}
public void SaveProduct(Product product) {
if (product.ProductID == 0) {
_context.Products.Add(product);
} else {
_context.Entry(product).State = EntityState.Modified;
}
_context.SaveChanges();
}
public void DeleteProduct(Product product) {
_context.Products.Remove(product);
_context.SaveChanges();
}
}
但是這是我開始有麻煩......我相信我需要爲EFDbContext
創建一個接口(見以下),所以我可以爲測試一個模擬回購代替它,但它是建立在類DbContext
:
public class EFDbContext : DbContext {
public DbSet<Product> Products { get; set; }
}
從System.Data.Entity
,我不能爲我的生活工作如何創建一個接口它...如果我創建以下界面,我會因爲缺少方法而出錯這是從DbContext
類,我不能建立使用「的DbContext」之類的`EFDbContext接口是因爲它是一個類而不是一個接口...
using System;
using System.Data.Entity;
using SportsStore.Domain.Entities;
namespace SportsStore.Domain.Concrete {
interface IEFDbContext {
DbSet<Product> Products { get; set; }
}
}
原始來源可以從可得this page包裝上的「源代碼/下載」我錯過了上述代碼片段中的某些內容(或者只是詢問我將添加它)。
我已經達到了我所理解的限度,無論我尋找還是閱讀,我似乎都無法解決我如何克服這個問題。 請幫忙!
我已經(或至少該書已經)已經得到了IProductRepository的單元測試,並測試應用程序如何管理保存,但它沒有去檢查EFProductRepostiory工作的水平(和書中的例子不!),所以我想爲此添加一些東西。測試數據保存到數據庫這似乎是我自己喜歡另一個級別的測試,我不知道正確的方式去做這個,因爲我猜如果我不使用模擬回購我將需要使用創建/擦除數據庫的腳本...是否正常的測試級別?這不是測試MySQL而不是應用程序!? – GazB
@Zasurus:測試數據庫層的工作是屬於* integration *或* system *測試的重要步驟。系統測試可以捕獲單元測試無法解決的問題(錯誤的數據庫連接字符串,EF模型與數據庫模式不同步等)。另一方面,你的代碼庫代碼看起來很簡單,許多人([* cough * Joel Spolsky])會爭辯說,通過單元測試,你會引入更多的維護開銷,而實際發現錯誤的可能性很小。 – StriplingWarrior
因爲它只是一個表格,所以我認爲它很簡單,但是這個項目的目的是學習它不會成爲一個實時應用程序。儘管我正在使用我學習的內容來創建將變爲現場的應用程序的開始。這將有望增長到一個體面的大小,因此我想確保我至少讓我的頭在這個應用程序上做這些正確的方式,所以我可以將它應用到真正的。 :)當前版本的應用程序超過150個表(儘管混亂,因此在MVC重寫),所以我相信單元測試將幫助那裏!稍後會嘗試以上。 – GazB