单元测试删除,即使在数据库中删除记录也会返回

Spi*_*793 3 c# asp.net-mvc nunit unit-testing

我正在使用 Nunit 来测试我的控制器中从数据库中删除记录的方法。一切正常,当我检查时记录被删除但不知何故

db.AssesorMaxProjectLoad.Find(previousLoad.ID) 
Run Code Online (Sandbox Code Playgroud)

仍然返回删除的值并使我的测试失败。

测试:

[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);
}
Run Code Online (Sandbox Code Playgroud)

控制器方法其测试:

[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 });
}
Run Code Online (Sandbox Code Playgroud)

发生了什么或我错过了什么?我不明白当它不再在数据库中时如何返回?

Ste*_*eve 5

这是因为DbContext您的单元测试中的 与DbContext您的控制器方法中的断开了连接。

如果您有两个DbContext. 当您删除数据库中的记录时,该更改不会发布到其他上下文,因此当您查找记录时,单元测试上下文不知道任何更改并返回原始值。

运行控制器方法后,您需要DbContext在单元测试中重新创建 ,以确保您查看最新数据。

或者,考虑DbContext完全模拟调用。