2010-08-06 11 views
8

Ich stieß auf ein Problem, als ich meinen HTML-Helfer testete. Grundsätzlich erstelle ich ein Raster mit vielen Zeilen, Spalten und verschiedenen Datentypen. In der Kopfzeile gibt es auch ein Bild, um den Benutzer darüber zu informieren, in welcher Spalte die Daten sortiert sind. Allerdings, wenn ich meinen Test zu schreiben jetzt (viel zu spät, aber besser spät als nie richtig ?!), bekomme ich diesen Fehler ausgelöst:Wie behebt man ein Problem mit dem Bildpfad beim Testen von HtmlHelper?

„Die Anwendung relativ virtueller Pfad ‚~/Bilder/SortingArrowUp .png 'kann nicht absolut gemacht werden, da der Pfad zu der Anwendung nicht bekannt ist. "

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

Wie kann ich dieses Problem lösen. Ich kann verstehen, dass dies ein Problem während des Tests sein könnte, und das Bild ist möglicherweise nicht verfügbar und all das, aber was ist der richtige Weg, dies zu tun?

Antwort

13

Der korrekte Weg besteht darin, UrlHelper.GenerateContentUrl anstelle von VirtualPathUtility aufzurufen. In Ihrem Helfer Code würden Sie so etwas tun:

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

Wenn Unit-Tests werden Sie richtig verspottet Kontextobjekte passieren in müssen. Sie müssen HttpContext.Request.ApplicationPath vortäuschen - einen Dummy-App-Pfad zurückgeben, HttpContext.Response.ApplyAppPathModifier() - nichts tun, HttpContext.Request.ServerVariables - null zurückgeben, HttpContext.Request.Path und HttpContext.Request.RawUrl - geben Sie einen Wert zurück, der Sinn ergibt.

+0

Cool, ich verstehe was du meinst. Müssen jetzt einige große Änderungen an meinen Helfern machen, wenn ich in der Lage sein sollte, dies zu benutzen, und in diesem Stadium kann ich es nicht tun. Aber ich weiß jetzt, wie es in der Zukunft geht. Danke für die Antwort. – MrW

+1

Mein Hilfsprogramm enthält keine HttpContext-Eigenschaft. Ich habe Zugriff auf die Klasse und kann die aktuelle Eigenschaft (HttpContext.Current) aufrufen, aber das scheitert, weil .GenerateContentUrl() eine HttpContextBase erwartet, keinen HttpContext ... was ist die Lösung hier? – ekkis

+1

@ekkis Bitte starten Sie eine neue Frage, da es scheint, als ob Sie eine andere Situation haben. – marcind

5

Sie können nur diese Überladung verwenden:

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

Dies ist, was UrlHelper.GenerateContentUrl intern verwendet, und Sie brauchen nur ApplicationPath zu verspotten.

+0

Worauf bezieht sich "Kontext" hier? – ekkis

+0

der aktuelle HttpContext –

+0

ja, ich habe es herausgefunden. Für andere arme Soden, die damit kämpfen, können Sie einen Kontext wie diesen erhalten: 'HttpContextBase currentContext = new HttpContextWrapper (HttpContext.Current);' – ekkis

Verwandte Themen