我正在尝试从我的控制器测试删除方法。
我有以下测试用例:
[TestMethod()]
[DeploymentItem("Courses.sdf")]
public void RemoveCourseConfirmedTest()
{
CoursesController target = new CoursesController();
int id = 50;
ActionResult actual;
CoursesDBContext db = new CoursesDBContext();
Course courseToDelete = db.Courses.Find(id);
List<CourseMeet> meets = db.Meets.Where(a => a.courseID == id).ToList();
actual = target.RemoveCourseConfirmed(courseToDelete);
foreach (CourseMeet meet in meets)
{
Assert.IsFalse(db.Meets.Contains(meet));
}
Assert.IsFalse(db.Courses.Contains(courseToDelete));
}
这是控制器方法
[HttpPost, ActionName("RemoveCourse")]
public ActionResult RemoveCourseConfirmed(Course course)
{
try
{
db.Entry(course).State = EntityState.Deleted;
db.SaveChanges();
return RedirectToAction("Index");
}
catch (DbUpdateConcurrencyException)
{
return RedirectToAction("RemoveMeet", new System.Web.Routing.RouteValueDictionary { { "concurrencyError", true } });
}
catch (DataException)
{
ModelState.AddModelError(string.Empty, "Unable to save changes. Try again.");
return View(course);
}
}
但是,当我运行测试用例时,我得到以下异常。
System.InvalidOperationException: An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
我通过调试器运行测试,发现问题出现在以下行:
db.Entry(course).State = EntityState.Deleted;
我不确定为什么会这样。
答案 0 :(得分:2)
我在这里看到的最大问题是您正在直接针对数据库进行测试。您的单元测试应特别模拟数据库依赖性。
但是,如果你这样做是不确定的,那么你得到的错误来自于你的测试打开了CoursesDBContext
,然后你的测试代码似乎正在使用它自己的CoursesDBContext
。因此,错误是因为您无法尝试从不同的上下文引用相同的实体。您将需要某种方式将您的上下文传递给您的类(公共属性或通过参数传递)