You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:41:09