Asp.net mvc 3 删除控制器方法的单元测试
我正在尝试从我的控制器测试delete方法 我有以下测试用例:Asp.net mvc 3 删除控制器方法的单元测试,asp.net-mvc-3,unit-testing,Asp.net Mvc 3,Unit Testing,我正在尝试从我的控制器测试delete方法 我有以下测试用例: [TestMethod()] [DeploymentItem("Courses.sdf")] public void RemoveCourseConfirmedTest() { CoursesController target = new CoursesController(); int id = 50; ActionResult actual;
[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));
}
然而,当我运行测试用例时,我得到了以下异常
System.InvalidOperationException: An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
我通过调试器运行了测试,发现问题出现在以下行:
db.Entry(course).State = EntityState.Deleted;
我不知道为什么会发生这种情况。我在这里看到的最大问题是您直接针对数据库进行测试。单元测试应该特别模拟数据库依赖关系
但是,如果您以这种方式死气沉沉,那么您得到的错误来自这样一个事实:您的测试正在打开一个
CoursesDBContext
,然后您的测试代码似乎正在使用它自己的CoursesDBContext
。因此,错误是因为您无法尝试从不同的上下文引用相同的实体。您将需要某种方式将上下文传递给类(公共属性或通过参数传递)单元测试应模拟DB上下文,并在为其设置预定义返回数据的执行过程中为在该上下文上执行的每个方法设置期望值。模拟您的上下文,设置输入和保存更改的预期。您目前正在做的是编写一个集成测试,它不仅测试控制器方法,还测试DB上下文的集成。
db.Entry(course).State = EntityState.Deleted;