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;

我不确定为什么会这样。

4

1 回答 1

2

我在这里看到的最大问题是您直接针对数据库进行测试。您的单元测试应该特别模拟数据库依赖项。

但是,如果您一心想这样做,那么您得到的错误来自您的测试正在打开 a CoursesDBContext,然后您的被测代码似乎正在使用它自己的CoursesDBContext. 因此,错误是因为您不能尝试从不同的上下文中引用相同的实体。您将需要某种方式将您的上下文传递给您的类(公共属性或通过参数传递)

于 2012-04-04T04:51:20.087 回答