У меня проблема с тем, что метод UrteHrl в UrlHelper возвращает только пустую строку при запуске в моих тестах, хотя работает правильно при выполнении в реальном HttpContext.Это, однако, поиск маршрута - поскольку я правильно получаю исключение, если я пытаюсь разрешить имя маршрута, которое не было определено.
Я издевался над HttpContext и друзьями, используя предоставленный код автор Scott Hanselman / Kzu и добавил код , необходимый для начальной загрузки маршрутов приложения в макетированный экземпляр
Чтобы уменьшить количество переменных в моей ситуации, я написал простойtest:
[Test]
public void UrlHelperReturnsCorrectUrl()
{
var controller = new MyController();
controller.SetFakeControllerContext().LoadUrlHelper();
Assert.AreEqual("My/Route/Path", controller.Url.RouteUrl("MyRoute"));
}
Интересно, что прямой доступ к RouteCollection и использование VirtualPath работает:
[Test]
public void GetVirtualPathReturnsCorrectUrl()
{
var controller = new AccountController();
controller.SetFakeControllerContext().LoadUrlHelper();
Assert.AreEqual("My/Route/Path",
Controller.Url.RouteCollection["MyRoute"]
.GetVirtualPath(
controller.Url.RequestContext,
new RouteValueDictionary())
.VirtualPath);
}
Для справки. Вот моя реализация метода расширения LoadUrlHelper:
public static Controller LoadUrlHelper(this Controller controller)
{
var routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);
controller.Url = new UrlHelper(
controller.ControllerContext.RequestContext,
routes);
return controller;
}
А вот мой маршрут, как определено в Global.asax моего приложения:
routes.MapRoute(
"MyRoute", "My/Route/Path",
new {controller = "Home", action = "Index"});
Кто-нибудь сталкивался с этим?Я что-то упустил?
РЕДАКТИРОВАТЬ:
Я следовал коду MVC до такой степени, что он передает обработку маршрута в System.Routing и нашел что-то очень интересное.Код, который MVC в конечном итоге запускает для поиска нужного URL-адреса (сокращенно, конечно), возвращает пустую строку:
Controller.Url.RouteCollection.GetVirtualPath(
Controller.Url.RequestContext,
"MyRoute", new RouteValueDictionary()).VirtualPath;
, тогда как чрезвычайно похожий вариант возвращает ожидаемую строку:
Controller.Url.RouteCollection["MyRoute"].GetVirtualPath(
Controller.Url.RequestContext,
new RouteValueDictionary()).VirtualPath;
Кажется, я не могу идти дальше в базовом коде, чтобы увидеть, что на самом деле здесь происходит по-другому, но подумал, что это может помочь кому-то понять, какую настройку мне не хватает.(Я пока не собираюсь кричать об ошибке, поскольку факт, что UrlHelpers работает в реальном HttpContext, действительно работает)