我正在尝试为控制器编写单元测试,该控制器返回带有视图,控制器和状态代码的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
我无法找到另一种运行此单元测试的方法,因此我可以测试我的控制器。
答案 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);
}