为何XUnit测试中RedirectToActionResult的ControllerName返回NULL?
为什么RedirectToActionResult的ControllerName为null?
这是完全正常的行为!原因很简单:当你在同一个控制器内部重定向时,ASP.NET Core MVC默认不需要指定控制器名称,所以RedirectToActionResult里的ControllerName会保持为null。
具体原因分析
你在HomeController的Create POST方法里调用的是:
return RedirectToAction("BoekingVerwerken", boeking);
这个调用用的是RedirectToAction(string actionName, object routeValues)这个重载——第二个参数是路由值(你的HotelBoeking对象),而不是控制器名称。由于重定向的目标Action和当前Action在同一个控制器里,框架会自动使用当前控制器,因此不会填充ControllerName属性,它自然就是null。
你的测试里断言ControllerName等于"Home",这和框架的默认行为冲突,所以才会失败。
解决方法(二选一)
1. 明确指定控制器名称
如果你希望ControllerName在结果中存在,可以改用带控制器名称参数的重载:
[HttpPost] public IActionResult Create(HotelBoeking boeking) { // 第二个参数是控制器名称,第三个是路由值 return RedirectToAction("BoekingVerwerken", "Home", boeking); }
这样修改后,你的原有测试断言就能通过了。
2. 调整测试断言以符合默认行为
既然同控制器重定向时ControllerName为null是合理的,你也可以修改测试来匹配这个预期:
var redirectToActionResult = Assert.IsType<RedirectToActionResult>(result2); // 去掉ControllerName的断言,或者断言它为null Assert.Null(redirectToActionResult.ControllerName); Assert.Equal("BoekingVerwerken", redirectToActionResult.ActionName);
简单总结:只有当你需要重定向到其他控制器的Action时,才必须指定控制器名称;同控制器内的重定向,框架会自动处理,不需要额外指定,所以ControllerName为null是正常的。
内容的提问来源于stack exchange,提问作者Yusuf Cum
相关产品推荐
相关产品推荐

