我正在尝试测试MVC操作,所以我创建了IRepository和MockRepository
public class Repository : DbContext, IRepository
{
public IDbSet<TEntity> SomeEntities { get; set; }
}
public interface IRepository : IDisposable
{
IDbSet<TEntity> SomeEntities { get; set; }
int SaveChanges();
}
使用Create
和Delete
操作很简单,但仍然坚持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);
}
所以我认为有两种方法可以解决这个问题:
我应该添加到IRepository新方法
DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
我怎么能这样做? DbContext.Entry
方法返回非常具体的DbEntityEntry<TEntity>
类型?
或改变我更新实体的方式?建议的方法是什么?
答案 0 :(得分:1)
我通常会比你更多地抽象EF的功能,这意味着我的行为看起来如下。
private IRepository repository;
public ActionResult Edit(TEntity entity)
{
if (ModelState.IsValid)
{
repository.Update(entity);
repository.SaveChanges();
return RedirectToAction("Index");
}
return View(entity);
}
然后您可以轻松创建模拟存储库并测试是否调用了所需的函数。
注意:我通常也会将我的实体与我的模型分开,并使用动作过滤器来管理我的工作单元,但这与此帖没有关系。