2012-04-04 2 views
0

컨트롤러에서 삭제 메소드를 테스트하려고합니다.유닛 테스트 컨트롤러 삭제 메소드

[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

단위 테스트는 DB 컨텍스트를 조롱하고 실행 중에 해당 컨텍스트에서 실행되는 각 메서드에 대한 기대치를 설정해야합니다. 사전 정의 된 리턴 데이터를 설정합니다. Context를 모의하고 Entry 및 SaveChanges에 대한 기대치를 설정하십시오. 현재 컨트롤러의 방법 이상을 테스트하는 테스트와 DB 컨텍스트의 통합 테스트를 수행하는 통합 테스트를 작성하고 있습니다. – Nope

답변

2

내가보기에 가장 큰 문제는 데이터베이스에 대해 직접 테스트한다는 것입니다. 단위 테스트는 특히 데이터베이스 종속성을 조롱해야합니다.

그러나이 방법을 사용하지 않을 경우 오류가 발생하는 것은 테스트에서 CoursesDBContext이 열리고 테스트중인 코드가 CoursesDBContext 인 것 같습니다. 따라서 다른 엔티티에서 동일한 엔티티를 참조 할 수 없으므로 오류가 발생합니다. 클래스 (공용 속성 또는 매개 변수를 통해 전달되는)에 컨텍스트에서 전달하는 방법이 필요합니다.

+0

고맙습니다. 나는 미래를 염두에 두겠다. – keshav

관련 문제