C# mvc4实体框架中CRUD操作中的单元测试

C# mvc4实体框架中CRUD操作中的单元测试,c#,entity-framework,unit-testing,asp.net-mvc-4,C#,Entity Framework,Unit Testing,Asp.net Mvc 4,我试图研究mvc4中的实体框架。我用CRUD操作在EF中创建了一个项目。现在我想对此进行单元测试(主要是依赖项注入)。我在谷歌上搜索了很多网站,尝试了模拟测试方法 http://www.codeproject.com/Articles/447988/How-to-Mock-Test-an-Entity-Framework-Model-First-P 但它没有起作用。实际上,单元测试EF的最佳方法是什么?为测试创建类或创建测试项目。这是我的crud操作代码,我怎样才能单元测试这个,请帮助我 Me

我试图研究mvc4中的实体框架。我用CRUD操作在EF中创建了一个项目。现在我想对此进行单元测试(主要是依赖项注入)。我在谷歌上搜索了很多网站,尝试了模拟测试方法

http://www.codeproject.com/Articles/447988/How-to-Mock-Test-an-Entity-Framework-Model-First-P
但它没有起作用。实际上,单元测试EF的最佳方法是什么?为测试创建类或创建测试项目。这是我的crud操作代码,我怎样才能单元测试这个,请帮助我

Member.cs

public class Member
{
    [Key]
    public int MemID {get;set;}

    [Required]
    [Display(Name = "Member Name")]
    [StringLength(50)]
    public string MemName { get; set; }

}
成员控制器

 public class MemberController : Controller
 {
    private SampleDataContext db = new SampleDataContext();

    //
    // GET: /Member/

    public ActionResult Index()
    {
        return View(db.Members.ToList());
    }

    //
    // GET: /Member/Details/5

    public ActionResult Details(int id = 0)
    {
        Member member = db.Members.Find(id);
        if (member == null)
        {
            return HttpNotFound();
        }
        return View(member);
    }

    //
    // GET: /Member/Create

    public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Member/Create

    [HttpPost]
    public ActionResult Create(Member member)
    {
        if (ModelState.IsValid)
        {
            db.Members.Add(member);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(member);
      }

    //
    // GET: /Member/Edit/5

    public ActionResult Edit(int id = 0)
    {
        Member member = db.Members.Find(id);
        if (member == null)
        {
            return HttpNotFound();
        }
        return View(member);
    }

    //
    // POST: /Member/Edit/5

    [HttpPost]
    public ActionResult Edit(Member member)
    {
        if (ModelState.IsValid)
        {
            db.Entry(member).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(member);
    }

    //
    // GET: /Member/Delete/5

    public ActionResult Delete(int id = 0)
    {
        Member member = db.Members.Find(id);
        if (member == null)
        {
            return HttpNotFound();
        }
        return View(member);
    }

    //
    // POST: /Member/Delete/5

    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {
        Member member = db.Members.Find(id);
        db.Members.Remove(member);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}

一般来说,我认识的大多数人都同意单元测试是关于隔离测试的。您提议的测试将测试您的控制器、模型和持久性层(以及您拥有的任何业务逻辑)

其次,考虑到数据库都是关于状态的,单元测试应该是无状态的……这将再次变得困难

但是…幸运的是…我一直在考虑如何使用SQL Server Compact和
DropDatabaseAlways
数据库初始值设定项创建无状态集成测试

public class FooContext : DbContext
{
    public FooContext(IDbInitializer<T> init = null, bool forceInit = false)
    {
        if(init != null)
            Database.SetInitializer(init);
        if(forceInit)
            Database.Init(true);
    }
}
这里的技巧是将测试项目设置为使用SQLServerCE连接字符串,并将
DropDatabaseAlways
作为初始值设定项注入

public class FooContext : DbContext
{
    public FooContext(IDbInitializer<T> init = null, bool forceInit = false)
    {
        if(init != null)
            Database.SetInitializer(init);
        if(forceInit)
            Database.Init(true);
    }
}
公共类FooContext:DbContext
{
公共FooContext(IDB初始值设定项init=null,bool forceInit=false)
{
if(init!=null)
SetInitializer(init);
if(forceInit)
Database.Init(true);
}
}

是,您可以通过各种类型的测试来测试代码。添加类库和测试代码的最简单方法。另一种方法是,您可以使用NUnit来测试它。为此,您必须添加某些dll文件才能使用NUnit。您能更详细地描述一下您想在这里测试什么吗?@Dawid:我只想测试每个crud操作,并知道如何在其中进行测试EF@siddhesh:你能告诉我怎么做吗,或者请建议一个教程,我正在尝试很多方法你可以参考:[链接]()