2010-08-06 19 views
8

Podczas testowania mojego Pomocnika HTML napotkałem problem. Zasadniczo tworzę siatkę z mnóstwem wierszy, kolumn i różnych typów danych. W nagłówku znajduje się również obraz informujący użytkownika, w jakiej kolumnie sortowane są dane. Jednak, gdy piszę mój test teraz (zbyt późno, ale lepiej późno niż wcale prawda ?!), otrzymuję ten błąd rzucony:Jak rozwiązać problem ze ścieżką obrazu podczas testowania HtmlHelper?

„Aplikacja względna ścieżka wirtualna „~/Images/SortingArrowUp .png 'nie może być absolutna, ponieważ ścieżka do aplikacji nie jest znana. "

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

Jak mogę rozwiązać ten problem. Mogę zrozumieć, jak może to być problemem podczas testu, a obraz może nie być dostępny i tak dalej, ale jaki jest właściwy sposób, aby to zrobić?

Odpowiedz

13

Poprawnym sposobem jest zadzwonić pod numer UrlHelper.GenerateContentUrl zamiast VirtualPathUtility. W kodzie pomocnika byś zrobił coś takiego:

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

Podczas testów jednostkowych będzie musiał przejść w prawidłowo szydzili obiekty kontekstowe. Musisz kpić z wersji HttpContext.Request.ApplicationPath - zwróć ścieżkę do obojętnej aplikacji, HttpContext.Response.ApplyAppPathModifier() - nic nie rób, HttpContext.Request.ServerVariables - return null, HttpContext.Request.Path i HttpContext.Request.RawUrl - zwracają jakąś wartość, która ma sens.

+0

Fajnie, rozumiem, co masz na myśli. Muszę teraz dokonać wielkich zmian dla moich pomocników, jeśli będę mógł z nich skorzystać i na tym etapie nie mogę tego zrobić. Ale teraz wiem, jak to zrobić w przyszłości. Dziękuję za odpowiedź. – MrW

+1

mój helper nie zawiera właściwości HttpContext. Mam dostęp do klasy i mogę wywołać jego bieżącą właściwość (HttpContext.Current), ale to się nie powiedzie, ponieważ .GenerateContentUrl() oczekuje HttpContextBase, a nie HttpContext ... jakie jest rozwiązanie tutaj? – ekkis

+1

@ekkis, proszę rozpocząć nowe pytanie, ponieważ wygląda na to, że masz inną sytuację. – marcind

5

można po prostu użyć tej przeciążeniem:

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

To co UrlHelper.GenerateContentUrl używa wewnętrznie, i trzeba tylko drwić ApplicationPath.

+0

co odnosi się tutaj do "kontekstu"? – ekkis

+0

bieżący HttpContext –

+0

tak, wymyśliłem to. dla innych biednych, zmagających się z tym, można uzyskać kontekst taki jak ten: 'HttpContextBase currentContext = new HttpContextWrapper (HttpContextBurrent);' – ekkis

Powiązane problemy