Как решить проблему с путем к изображению при тестировании HtmlHelper? - PullRequest
8 голосов
/ 06 августа 2010

Я столкнулся с проблемой, когда тестировал свой HTML Helper. По сути, я создаю сетку с множеством строк, столбцов и различных типов данных. В заголовке также есть изображение, чтобы уведомить пользователя, по какому столбцу отсортированы данные. Однако, когда я пишу свой тест сейчас (слишком поздно, но лучше поздно, чем никогда ?!), я получаю эту ошибку:

"Относительный виртуальный путь приложения «~ / Images / SortingArrowUp.png» не может быть абсолютным, потому что путь к приложение неизвестно. "

 var imgPath = VirtualPathUtility.ToAbsolute("~/Images/SortingArrowUp.png");

Как я могу решить это. Я могу понять, как это может быть проблемой во время теста, и изображение может быть недоступно и все такое, но каков правильный способ сделать это тогда?

Ответы [ 2 ]

15 голосов
/ 07 августа 2010

Правильный способ - позвонить UrlHelper.GenerateContentUrl вместо VirtualPathUtility.В вашем вспомогательном коде вы должны сделать что-то вроде этого:

MvcHtmlString MyHelper(this HtmlHelper helper, ...) {
  // other code
  var imgPath = UrlHelper.GenerateContentUrl("~/Images/SortingArrowUp.png",
                                             helper.ViewContext.HttpContext);
  // other code
}

При модульном тестировании вам придется передавать правильно смоделированные контекстные объекты.Вам нужно смоделировать HttpContext.Request.ApplicationPath - вернуть какой-нибудь фиктивный путь к приложению, HttpContext.Response.ApplyAppPathModifier() - ничего не делать, HttpContext.Request.ServerVariables - вернуть ноль, HttpContext.Request.Path и HttpContext.Request.RawUrl - вернуть какое-то значение, которое имеет смысл.

5 голосов
/ 17 ноября 2010

Вы можете просто использовать эту перегрузку:

var imgPath = VirtualPathUtility.ToAbsolute("~/Images/SortingArrowUp.png", 
    context.Request.ApplicationPath);

Это то, что UrlHelper.GenerateContentUrl использует для внутреннего использования, и вам нужно только издеваться ApplicationPath.

...