我正在尝试在mvc4中学习实体框架。我在EF中使用CRUD操作创建了一个项目。现在我想对它进行单元测试(主要是依赖注入)。我用Google搜索了许多网站,并试图进行模拟测试方法,
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; }
}
MemberController
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);
}
}
答案 0 :(得分:1)
一般来说,我认识的大多数人都认为UnitTesting是关于隔离测试的。您提出的测试将测试您的Controller,您的模型和您的Persistance层(以及您拥有的任何业务逻辑)。
其次,鉴于数据库是关于STATE的全部,而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);
}
}