Хм ... Я не знаю, является ли это лучшим решением, потому что оно требует насмешек, но, возможно, это поможет. Вы на правильном пути, и заводская часть контроллера проста, когда вы знаете, какой контроллер создается, поэтому вопрос в том, какой самый быстрый способ получить объект RouteData из произвольного URL.
И единственный способ, которым я знаю, как было бы, с Moq:
string url = "~/Account/LogOn"; //trying to create Account controller in default MVC app
RouteCollection rc = new RouteCollection();
MvcApplication.RegisterRoutes(rc);
System.Web.Routing.RouteData rd = new RouteData();
var mockHttpContext = new Moq.Mock<HttpContextBase>();
var mockRequest = new Moq.Mock<HttpRequestBase>();
mockHttpContext.Setup(x => x.Request).Returns(mockRequest.Object);
mockRequest.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(url);
RouteData routeData = rc.GetRouteData(mockHttpContext.Object);
string controllerName = routeData.Values["controller"].ToString();
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(this.ControllerContext.RequestContext, controllerName);
Я немного погуглил и не смог найти ничего, что не относилось к юнит-тестированию / издевательствам. Я не знаю, если это , это быстро и легко сделать это, но, конечно, хотел бы знать, если у кого-то есть лучшее решение!