【问题标题】:Dealing with TempData variables in Unit Tests在单元测试中处理 TempData 变量
【发布时间】:2020-01-08 21:40:40
【问题描述】:

按照这里的例子:

Mocking a TempData in ASP.NET Core in MSTest,

我写了以下TestMethod:

[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

'对象引用未设置为对象的实例。'

为什么会发生这种情况,我该如何解决?

【问题讨论】:

    标签: c# unit-testing asp.net-core tempdata


    【解决方案1】:

    因为 Back 不返回 ViewResult - 它返回 RedirectToActionResult(您可以将鼠标悬停在 RedirectToAction 上以查看确切的对象名称)。这两个都实现了IActionResult

    您会收到空引用异常,因为当您使用 as 关键字转换对象时,如果无法进行转换,它将返回空值。

    如果你有

    var result = (ViewResult)controller.Back();
    

    您会在该行的运行时收到一个差异异常,说明无法进行转换。

    您应该使用以下方法之一进行转换:

    var result = (RedirectToActionResult)controller.Back();
    

    var result = controller.Back() as RedirectToActionResult;
    

    【讨论】:

    • 哦,不是因为TempData!非常感谢您的帮助,它现在运行良好。
    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2015-04-27
    相关资源
    最近更新 更多