如何使用Code First测试MVC操作?

时间:2011-07-01 10:26:04

标签: c# asp.net-mvc unit-testing ef-code-first

我正在尝试测试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();
}

使用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 个答案:

答案 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);
}

然后您可以轻松创建模拟存储库并测试是否调用了所需的函数。

注意:我通常也会将我的实体与我的模型分开,并使用动作过滤器来管理我的工作单元,但这与此帖没有关系。