C# 在单元测试中处理TempData变量

C# 在单元测试中处理TempData变量,c#,unit-testing,asp.net-core,tempdata,C#,Unit Testing,Asp.net Core,Tempdata,下面的示例如下: , 我写下了以下测试方法: [Fact] public void TestBackMethod() { var httpContext = new DefaultHttpContext(); var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>()); tempData["id"] = 3008; var controller = n

下面的示例如下:

,

我写下了以下测试方法:

[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);
}
然而,在这方面:

Assert.Contains("Index", result.ViewName);
结果
null

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


为什么会发生这种情况?我如何修复它?

因为
返回
查看结果
-它返回
重定向到操作结果
(您可以将鼠标悬停在重定向到操作上以查看确切的对象名)。这两种方法都实现了
IActionResult

您会得到一个空引用异常,因为当您使用
as
关键字强制转换对象时,如果转换不可能,它将返回空

如果你有

var result = (ViewResult)controller.Back();
您将在该行的运行时得到一个差异异常,表示转换不可能

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

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


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

您会得到一个空引用异常,因为当您使用
as
关键字强制转换对象时,如果转换不可能,它将返回空

如果你有

var result = (ViewResult)controller.Back();
您将在该行的运行时得到一个差异异常,表示转换不可能

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

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


哦,所以这不是因为
TempData
!非常感谢您的帮助,它现在工作得很好。哦,这不是因为
TempData
!非常感谢你的帮助,它现在工作得很好。