使用XUnit和Moq测试Asp.Net MVC Core ErrorController时RouteData报错
解决RouteData实例化编译错误的方案
问题原因
ASP.NET Core 3.0+版本中,RouteData的构造函数不再提供无参重载,必须传入pageType和routeValues两个必填参数,这是导致你编译报错的核心原因。
解决方法
方法1:按构造函数要求传入参数
测试场景下可以直接传入null作为页面类型,搭配空字典作为路由值:
var routeData = new RouteData(null, new Dictionary<string, object?>());
方法2:通过控制器上下文初始化
在测试控制器时,更规范的方式是给控制器的ControllerContext赋值,自动关联RouteData:
var errorController = new ErrorController(); errorController.ControllerContext = new ControllerContext { RouteData = new RouteData(null, new Dictionary<string, object?>()) };
方法3:反射创建无参实例(仅测试场景)
如果不需要使用RouteData的实际功能,可通过反射绕过构造函数限制:
var routeData = (RouteData)Activator.CreateInstance(typeof(RouteData), nonPublic: true);
调整后的测试代码示例
using Xunit; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; public class ErrorControllerTests { [Fact] public void HttpStatusCodeHandler_404_ReturnsView() { // 初始化控制器及上下文 var controller = new ErrorController(); controller.ControllerContext = new ControllerContext { RouteData = new RouteData(null, new Dictionary<string, object?>()) }; // 执行测试方法 var result = controller.HttpStatusCodeHandler(404); // 断言结果类型 Assert.IsType<ViewResult>(result); } }
内容的提问来源于stack exchange,提问作者Goober
相关产品推荐
相关产品推荐

