2011-07-01 61 views
1

我試圖測試MVC的行動,所以我創建IRepository和MockRepository如何使用Code First測試MVC操作?

public class Repository : DbContext, IRepository 
{ 
    public IDbSet<TEntity> SomeEntities { get; set; } 
} 

public interface IRepository : IDisposable 
{ 
    IDbSet<TEntity> SomeEntities { get; set; } 

    int SaveChanges(); 
} 

隨着CreateDelete行動是簡單,但堅持了Edit行動:

private IRepository repository; 

    public ActionResult Edit(TEntity entity) 
    { 
     if (ModelState.IsValid) 
     { 
      repository.Entry(entity).State = EntityState.Modified; 
      repository.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 

     return View(entity); 
    } 

所以我看到兩個方法來解決這個問題:

  1. 我應該添加到IRepository新方法

    DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class; 
    

    我該怎麼辦? DbContext.Entry方法返回非常具體DbEntityEntry<TEntity>類型?

  2. 或改變我更新實體的方式?建議如何做到這一點?

回答

1

我通常會抽象EF的功能比你更多,這意味着我的行動看起來如下。

private IRepository repository; 
public ActionResult Edit(TEntity entity) 
{ 
    if (ModelState.IsValid) 
    { 
     repository.Update(entity); 
     repository.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 

    return View(entity); 
} 

然後你可以很容易地做一個模擬庫並測試所需的函數被調用。

注意:我通常還會將我的實體與模型分開,並使用動作過濾器管理我的工作單元,但這與本文不相關。