MVC单元测试RedirectToAction,返回状态代码

时间:2018-03-16 13:01:49

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

我正在尝试为控制器编写单元测试,该控制器返回带有视图,控制器和状态代码的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

我无法找到另一种运行此单元测试的方法,因此我可以测试我的控制器。

1 个答案:

答案 0 :(得分:0)

经过几个小时的挫折之后,我找到了答案,试图弄清楚为什么我发现堆栈溢出的答案都不起作用。

问题在于我找到的所有答案是他们希望你将RedirectToAction强制转换为RedirectToRouteResult如果这样做会导致异常被抛出,因为它无法解决将我们正在使用的RedirectToAction转换为RedirectToRouteResult您获得的例外

  

System.InvalidCastException:'无法转换类型' Microsoft.AspNetCore.Mvc.RedirectToActionResult'输入' Microsoft.AspNetCore.Mvc.RedirectToRouteResult'。'

要解决此问题,以便对控制器进行单元测试,您只需将控制器调用转发给RedirectToActionResult,然后执行断言,使其看起来像Assert.AreEqual("Index", result.RouteValues["action"]);。完整的代码块看起来像。

[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);
}