Unit-test risorse locali e globali in asp.net mvc
-
06-07-2019 - |
Domanda
Ho una classe che avvolge GetGlobalResourceObject e GetLocalResourceObjet in modo che possano essere facilmente utilizzati in MVC. Le classi di validazione del modello caricano quindi i messaggi di errore dinamicamente dai file di risorse. Il problema è il test unitario. Il codice usa " ~ / " ;, e mentre tutto funziona correttamente quando viene eseguita la soluzione, non riesco a vedere come effettuare i test unitari perché ricevo sempre il seguente errore " System.Web.HttpException: il percorso virtuale relativo dell'applicazione '~ /' non può essere reso assoluto, perché il percorso dell'applicazione non è noto. "
Il codice che genera l'eccezione è il seguente, utilizzato per valutare un'espressione e restituire un oggetto risorsa globale.
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
Qualche idea su come testare questo e altri codici che utilizzano file di risorse?
Soluzione
Ho adottato un approccio leggermente diverso. Uso i file di risorse al di fuori delle directory App_ *, nel qual caso l'IDE aggiungerà uno strumento personalizzato al file per generare un wrapper fortemente tipizzato per le risorse che funzionano ovunque nella soluzione, incluso nelle viste, e si comportano durante i test unitari: http://odetocode.com/Blogs/scott/archive/ 2009/07/15 / 13211.aspx
Questa non è una risposta esatta alla tua domanda, ma credo che far funzionare correttamente le risorse App_ * in tutte le condizioni sia stato un po 'di lavoro.
Altri suggerimenti
Potresti creare una proprietà nella tua classe ResourceExtensions, ad esempio bool IsInTestScope, e quindi nella tua classe di test impostarla su true e all'interno del metodo che restituisce testo localizzato fai qualcosa del genere:
risorsa stringa statica pubblica (questo controller controller, espressione stringa, oggetto params [] args)
{
if (! IsInTestScope)
{
Campi ResourceExpressionFields = GetResourceFields (espressione, " ~ / ");
restituisce GetGlobalResource (fields, args);
}
return string.Empty;
}
Ho trovato un approccio per testare il codice che utilizza risorse all'interno delle directory App_ *. Ho descritto la mia soluzione nel mio blog link text