c# - 单元测试删除,即使在数据库中删除了记录也返回

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

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

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);
}

Controller 方法及其测试:

[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 });
}

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

最佳答案

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

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

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

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

关于c# - 单元测试删除,即使在数据库中删除了记录也返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42637191/

相关文章:

c# - 从 C# 终结器调用静态方法

c# - 如何读取owin中间件中的自定义 header ?

java - 如何对使用 session 窗口的 kafka 流应用程序进行单元测试

javascript - Angular 单元测试中的业力代码覆盖率报告中的 1x 3x 等是什么意思?

c# - WPF 工具包,在 DatePicker 中更改日期格式

c# - 如何取消WPF窗体的最小化事件

c# - 如何从客户端设置 HTMLEditorExtender HTML

asp.net-mvc - MVC ELMAH 和 SQL Azure

asp.net-mvc - kendo UI Grid MVC 初始页面

python - 单元测试 : How can i import test classes dynamically and run?