Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC单元测试返回状态代码的RedirectToAction_C#_Unit Testing_Asp.net Core 2.0 - Fatal编程技术网

C# MVC单元测试返回状态代码的RedirectToAction

C# MVC单元测试返回状态代码的RedirectToAction,c#,unit-testing,asp.net-core-2.0,C#,Unit Testing,Asp.net Core 2.0,我试图为一个控制器编写一个单元测试,它返回一个带有视图、控制器和状态代码的RedirectToAction。回报如下 return RedirectToAction("Index", "Errors", new {statusCode = StatusCodes.Status505HttpVersionNotsupported}); 我已经找到了几篇关于堆栈溢出的文章,但是没有一篇帮助我找出我的单元测试的问题所在 [TestMethod] public void Index_OnError_T

我试图为一个控制器编写一个单元测试,它返回一个带有视图、控制器和状态代码的
RedirectToAction
。回报如下

return RedirectToAction("Index", "Errors", new {statusCode = StatusCodes.Status505HttpVersionNotsupported});
我已经找到了几篇关于堆栈溢出的文章,但是没有一篇帮助我找出我的单元测试的问题所在

[TestMethod]
public void Index_OnError_ThrowsException()
{
    //Arrange
    Service.Setup(m => m.GetAllViewModels()).Throws(new NullReferenceException());

    //Act
    var result = (RedirectToRouteResult) controller.Index();


    //Assert
    Assert.AreEqual("Index", result.RouteValues["action"]);
    Assert.AreEqual("Error", result.RouteValues["controller"]);
}
我不断抛出一个异常,表示它无法强制转换

RedirectToRouteResult到类型RedirectToRouteResult


我想不出另外一种方法来运行这个单元测试,这样我就可以测试我的控制器了。

在几个小时的沮丧之后,我找到了答案,试图找出为什么我发现的堆栈外溢出的答案不起作用

问题是我找到的所有答案都是他们希望您将
RedirectToAction
强制转换为
RedirectToRouteResult
如果您这样做,您将遇到一个抛出的异常,因为它无法将我们用于
RedirectToRouteResult
强制转换为您得到的异常是

System.InvalidCastException:“无法将类型为“Microsoft.AspNetCore.Mvc.RedirectToActionResult”的对象强制转换为类型为“Microsoft.AspNetCore.Mvc.RedirectToRouteResult”。”

要解决此问题以便对控制器进行单元测试,只需将控制器调用强制转换为
RedirectToActionResult
,然后执行断言,使其看起来像
Assert.AreEqual(“Index”,result.RouteValues[“valueName]”)。完整的代码块如下所示

[TestMethod]
public void Index_OnError_RedirectsToErrorPage()
{
    //Arrange
    Service.Setup(m => m.GetAllViewModels()).Throws(new NullReferenceException());

    //Act
    var result = (RedirectToActionResult)controller.Index();

    //Assert
    Assert.AreEqual("Index", result.ActionName);
    Assert.AreEqual("Errors", result.ControllerName);
}

System.InvalidCastException:“无法将类型为“Microsoft.AspNetCore.Mvc.RedirectToActionResult”的对象强制转换为类型为“Microsoft.AspNetCore.Mvc.RedirectToRouteResult”。
您可能希望更新问题以反映这一点。