在单元测试中处理 TempData 变量
Dealing with TempData variables in Unit Tests
按照此处的示例:
、
我记下了下面的测试方法:
[Fact]
public void TestBackMethod()
{
var httpContext = new DefaultHttpContext();
var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>());
tempData["id"] = 3008;
var controller = new PhaseController(Configuration)
{
TempData = tempData
};
var result = controller.Back() as ViewResult;
Assert.Contains("Index", result.ViewName);
}
对于此控制器方法:
public IActionResult Back()
{
int releaseId = (int)TempData["id"];
return RedirectToAction("Index", "Phase", new { id = releaseId });
}
然而,在这一行:
Assert.Contains("Index", result.ViewName);
result
是 null
.
'Object reference not set to an instance of an object.'
为什么会发生这种情况,我该如何解决?
因为 Back
不是 return ViewResult
- 它 return 是 RedirectToActionResult
(您可以将鼠标悬停在 RedirectToAction 上以查看确切的对象名称).这两个都实现了 IActionResult
.
你会得到一个空引用异常,因为当你使用 as
关键字来转换对象时,如果转换不可能,它将 return null。
如果你有
var result = (ViewResult)controller.Back();
您会在该行的 运行 时间内收到差异异常,表示无法进行转换。
您应该使用以下方法之一进行转换:
var result = (RedirectToActionResult)controller.Back();
或
var result = controller.Back() as RedirectToActionResult;
按照此处的示例:
我记下了下面的测试方法:
[Fact]
public void TestBackMethod()
{
var httpContext = new DefaultHttpContext();
var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>());
tempData["id"] = 3008;
var controller = new PhaseController(Configuration)
{
TempData = tempData
};
var result = controller.Back() as ViewResult;
Assert.Contains("Index", result.ViewName);
}
对于此控制器方法:
public IActionResult Back()
{
int releaseId = (int)TempData["id"];
return RedirectToAction("Index", "Phase", new { id = releaseId });
}
然而,在这一行:
Assert.Contains("Index", result.ViewName);
result
是 null
.
'Object reference not set to an instance of an object.'
为什么会发生这种情况,我该如何解决?
因为 Back
不是 return ViewResult
- 它 return 是 RedirectToActionResult
(您可以将鼠标悬停在 RedirectToAction 上以查看确切的对象名称).这两个都实现了 IActionResult
.
你会得到一个空引用异常,因为当你使用 as
关键字来转换对象时,如果转换不可能,它将 return null。
如果你有
var result = (ViewResult)controller.Back();
您会在该行的 运行 时间内收到差异异常,表示无法进行转换。
您应该使用以下方法之一进行转换:
var result = (RedirectToActionResult)controller.Back();
或
var result = controller.Back() as RedirectToActionResult;