Unit-Tests von lokalen und globalen Ressourcen in asp.net mvc
-
06-07-2019 - |
Frage
Ich habe eine Klasse, die wraps die GetGlobalResourceObject und GetLocalResourceObjet, so dass Sie kann leicht verwendet werden in MVC.Die Validierung des Modells Klassen dann laden Sie die Fehlermeldungen, die dynamisch aus Ressourcen-Dateien.Das problem ist, unit-Tests.Verwendet den code "~/", und während alles funktioniert korrekt, wenn die Lösung ausgeführt wird, kann ich nicht sehen, wie die unit-tests, weil ich immer die folgende Fehlermeldung "System.Web.HttpException:Die Anwendung der relativen virtuellen Pfad '~/' nicht verabsolutiert werden, da der Pfad zu der Anwendung ist nicht bekannt."
Der code, der die Ausnahme ausgelöst wird, ist die folgende, verwendet, um einen Ausdruck auszuwerten und Rücksendung einer globalen Ressource-Objekt.
Private Function GetExpressionFields(ByVal expression As String) As ResourceExpressionFields
Return GetExpressionFields(expression, "~/")
End Function
Private Function GetExpressionFields(ByVal expression As String, ByVal path As String) As ResourceExpressionFields
Dim context As New ExpressionBuilderContext(path)
Dim resource_builder As New ResourceExpressionBuilder()
Dim fields As ResourceExpressionFields
fields = DirectCast(resource_builder.ParseExpression(expression, GetType(String), context), ResourceExpressionFields)
Return fields
End Function
Irgendwelche Ideen auf, wie um zu testen, diese und andere Codes, die verwendet Ressource-Dateien?
Lösung
Ich nahm einen etwas anderen Ansatz.Ich benutze Ressource-Dateien außerhalb des App_* Verzeichnisse, in diesem Fall wird die IDE fügen Sie ein benutzerdefiniertes tool, um die Datei zu erzeugen eine stark typisierte wrapper für die Ressourcen, die funktioniert überall in der Lösung, einschließlich der in Aussicht, und verhält sich während unit-tests: http://odetocode.com/Blogs/scott/archive/2009/07/15/13211.aspx
Das ist nicht eine genaue Antwort auf deine Frage, aber ich glaube, dass immer die App_* Ressourcen, die sich korrekt Verhalten unter allen Bedingungen war ziemlich viel Arbeit.
Andere Tipps
Sie konnten eine Eigenschaft in Ihrer ResourceExtensions Klasse erstellen, zum Beispiel Bool IsInTestScope, und dann in der Testklasse stellen es auf wahr, und im Inneren Methode, die lokalisierte Text etwas tun, wie diese zurückgibt:
public static string Ressource (dieser Controller-Controller, String-Ausdruck, params Object [] args)
{
if (! IsInTestScope)
{
ResourceExpressionFields Felder = GetResourceFields (Ausdruck, "~ /");
Rückkehr GetGlobalResource (Felder, args);
}
Rückkehr string.Empty;
}
Ich habe Ansatz für die Test-Code gefunden, die Ressourcen innerhalb app_ * Verzeichnisse verwendet. Ich beschrieb meine Lösung in meinem Blog Linktext