컨트롤러에서 삭제 메소드를 테스트하려고합니다.유닛 테스트 컨트롤러 삭제 메소드
[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;
내가 왜 이런 일 모르겠습니다.
단위 테스트는 DB 컨텍스트를 조롱하고 실행 중에 해당 컨텍스트에서 실행되는 각 메서드에 대한 기대치를 설정해야합니다. 사전 정의 된 리턴 데이터를 설정합니다. Context를 모의하고 Entry 및 SaveChanges에 대한 기대치를 설정하십시오. 현재 컨트롤러의 방법 이상을 테스트하는 테스트와 DB 컨텍스트의 통합 테스트를 수행하는 통합 테스트를 작성하고 있습니다. – Nope