在 mvc4 中的实体框架工作中对 CRUD 操作进行单元测试

本文关键字:操作 CRUD 单元测试 工作中 mvc4 实体 框架 | 更新日期: 2023-09-27 18:33:26

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

http://www.codeproject.com/Articles/447988/How-to-Mock-Test-an-Entity-Framework-Model-First-P

但它没有用。实际上,对 EF 进行单元测试的最佳方法是什么?创建用于测试的类或创建测试项目。这是我的 crud 操作代码,我该如何对此进行单元测试,请帮助我。

会员.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);
    }
}

在 mvc4 中的实体框架工作中对 CRUD 操作进行单元测试

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

其次,鉴于数据库都是关于状态的,而单元测试应该是无状态的......这又是困难的。

然而。。。幸运的是你...我一直在考虑如何使用 SQL Server Compact 和 DropDatabaseAlways<T> 数据库初始值设定项创建无状态集成测试。

此处的诀窍是将测试项目设置为使用 SQL Server CE 连接字符串,并将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);
    }
}