在单元测试中处理 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);

resultnull.

'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;