Prueba de unidad de recursos locales y globales en asp.net mvc
-
06-07-2019 - |
Pregunta
Tengo una clase que envuelve GetGlobalResourceObject y GetLocalResourceObjet para que puedan usarse fácilmente en MVC. Las clases de validación del modelo cargan los mensajes de error dinámicamente desde los archivos de recursos. El problema son las pruebas unitarias. El código usa " ~ / " ;, y aunque todo funciona correctamente cuando se ejecuta la solución, no puedo ver cómo hacer las pruebas unitarias porque siempre recibo el siguiente error " System.Web.HttpException: la ruta virtual relativa de la aplicación '~ /' no se puede convertir en absoluto, porque no se conoce la ruta a la aplicación. "
El código que genera la excepción es el siguiente, utilizado para evaluar una expresión y devolver un objeto de recurso global.
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
¿Alguna idea sobre cómo probar este y otros códigos que usan archivos de recursos?
Solución
Tomé un enfoque ligeramente diferente. Utilizo archivos de recursos fuera de los directorios App_ *, en cuyo caso el IDE agregará una herramienta personalizada al archivo para generar un contenedor fuertemente tipado para los recursos que funciona en cualquier parte de la solución, incluidas las vistas, y se comporta durante las pruebas unitarias: http://odetocode.com/Blogs/scott/archive/ 2009/07/15 / 13211.aspx
Esa no es una respuesta exacta a su pregunta, pero creo que hacer que los recursos App_ * se comporten correctamente en todas las condiciones fue bastante trabajo.
Otros consejos
Puede crear una propiedad en su clase ResourceExtensions, por ejemplo bool IsInTestScope, y luego en su clase de prueba establecerlo en verdadero, y el método interno que devuelve texto localizado hace algo como esto:
Recurso público de cadena estática (este controlador de controlador, expresión de cadena, objeto params [] args)
{
if (! IsInTestScope)
{
ResourceExpressionFields fields = GetResourceFields (expresión, " ~ / ");
return GetGlobalResource (campos, argumentos);
}
cadena de retorno. Vacío;
}
He encontrado un enfoque para probar el código que usa recursos dentro de los directorios App_ *. Describí mi solución en mi blog texto del enlace