【问题标题】:Unit Testing Delete, record returned even though it is deleted in the DB单元测试删除,即使在数据库中删除记录也会返回
【发布时间】:2017-07-27 00:08:02
【问题描述】:

我正在使用 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 });
}

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

【问题讨论】:

  • 你的测试中 db 来自哪里?是否有可能它是一个不同的上下文实例并且它已经缓存了实体?
  • 这是一个集成测试吗?
  • 是的,它确实是一个集成测试

标签: c# asp.net-mvc unit-testing nunit


【解决方案1】:

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

如果您有两个 DbContext 实例,会发生什么情况。当您删除数据库中的一条记录时,该更改不会发布到其他上下文,因此当您为您的记录进行查找时,单元测试上下文不知道任何更改并返回原始值。

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

或者,研究完全模拟 DbContext 调用。

【讨论】:

  • 这么简单我怎么会错过它,这正是问题所在。非常感谢
  • @Steve - 有目共睹,+1。
  • @Brian 哦,相信我,这是一项来之不易的知识。
猜你喜欢
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多