2010-08-06 18 views
8

Mi sono imbattuto in un problema quando stavo testando il mio helper HTML. Fondamentalmente sto creando una griglia con un sacco di righe, colonne e diversi tipi di dati al suo interno. Nell'intestazione è presente anche un'immagine per notificare all'utente la colonna in base alla quale vengono ordinati i dati. Tuttavia, quando sto scrivendo il mio test ora (troppo tardi, ma meglio tardi che mai giusto ?!), ottengo questo errore gettato:Come risolvere il problema con il percorso dell'immagine durante il test di HtmlHelper?

"L'applicazione relativa percorso virtuale '~/Immagini/SortingArrowUp .png 'can not essere reso assoluto, perché il percorso di l'applicazione non è noto. "

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

Come posso risolvere questo problema. Posso capire come questo potrebbe essere un problema durante il test e l'immagine potrebbe non essere disponibile e tutto il resto, ma qual è il modo corretto di farlo in quel momento?

risposta

13

Il modo corretto è chiamare UrlHelper.GenerateContentUrl anziché VirtualPathUtility. Nel codice di supporto si dovrebbe fare qualcosa di simile:

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

Quando unità di test si dovrà passare in oggetti di contesto correttamente deriso. È necessario simulare HttpContext.Request.ApplicationPath - restituire un percorso fittizio per app, HttpContext.Response.ApplyAppPathModifier() - non fare nulla, HttpContext.Request.ServerVariables - restituire null, HttpContext.Request.Path e HttpContext.Request.RawUrl - restituire un valore che ha senso.

+0

Cool, capisco cosa intendi. Ho bisogno di apportare grandi cambiamenti ai miei aiutanti ora se dovessi essere in grado di usarlo, e in questa fase non posso farlo. Ma ora so come farlo in futuro. Grazie per la risposta. – MrW

+1

il mio helper non contiene una proprietà HttpContext. Ho accesso alla classe e posso chiamare la sua proprietà corrente (HttpContext.Current) ma fallisce perché .GenerateContentUrl() si aspetta un HttpContextBase, non un HttpContext ... qual è la soluzione qui? – ekkis

+1

@ekkis per favore inizia una nuova domanda in quanto sembra che tu abbia una situazione diversa. – marcind

5

Si può semplicemente utilizzare questo sovraccarico:

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

Questo è ciò che UrlHelper.GenerateContentUrl utilizza internamente, e avete solo bisogno di prendere in giro ApplicationPath.

+0

a cosa si riferisce "contesto" qui? – ekkis

+0

l'attuale HttpContext –

+0

sì, l'ho capito. per altre povere zolle che lottano con questo, è possibile ottenere un contesto come questo: 'HttpContextBase currentContext = new HttpContextWrapper (HttpContext.Current);' – ekkis

Problemi correlati