我正在使用Nunit来测试我的控制器中的一个方法,该方法从数据库中删除一条记录。一切正常,当我检查时,记录被删除
db.AssesorMaxProjectLoad.Find(previousLoad.ID)
仍会返回已删除的值并使我的测试失败。
测试:
[Test]
public void AssesorMaxProjectLoadsDeleteLoad()
{
var previousLoad = db.AssesorMaxProjectLoad.Where(t => t.AssesorID == testAssesor3ID).FirstOrDefault(t => t.TaskGroupID == taskGroupID);
var result = controller.DeleteConfirmed(previousLoad.ID) as ViewResultBase;
var newProjectLoad = db.AssesorMaxProjectLoad.Find(previousLoad.ID).MaxAssignedProjectLoad;
Assert.AreEqual(null, newProjectLoad);
}
控制器方法测试:
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
AssesorMaxProjectLoad assesorMaxProjectLoad = db.AssesorMaxProjectLoad.Find(id);
db.AssesorMaxProjectLoad.Remove(assesorMaxProjectLoad);
db.SaveChanges();
return RedirectToAction("Index", "AssesorMaxProjectLoads", new { id = assesorMaxProjectLoad.TaskGroupID });
}
发生了什么事或我错过了什么?我不明白当它不在数据库中时如何返回它?
答案 0 :(得分:4)
这是因为您的单元测试中的DbContext
与控制器方法中的DbContext
断开连接。
如果您有两个DbContext
个实例,会发生什么。当您删除数据库中的记录时,该更改不会公布给其他上下文,因此当您查找记录时,单元测试上下文不知道任何更改并返回原始值。
在运行控制器方法之后,您需要在单元测试中重新创建DbContext
,以确保您查看最新数据。
或者,请完全嘲笑DbContext
来电。