Creo que un enfoque estándar para esto es usar un patrón de fachada para envolver el administrador de configuración y luego tienes algo vagamente acoplado sobre el que tienes control.
Entonces, envolvería el ConfigurationManager. Algo como:
public class Configuration: IConfiguration
{
public User
{
get
{
return ConfigurationManager.AppSettings["User"];
}
}
}
(Puede extraer una interfaz de su clase de configuración y luego usar esa interfaz en todas partes en su código) Luego simplemente se burla de la IConfiguration. Es posible que pueda implementar la fachada en sí de diferentes maneras. Arriba elegí solo para envolver las propiedades individuales. También obtiene el beneficio adicional de tener información fuertemente tipada para trabajar en lugar de matrices hash tipadas débilmente.
var configurationMock = new Mock<IConfiguration>();
y para la configuración:configurationMock.SetupGet(s => s.User).Returns("This is what the user property returns!");
Estoy usando AspnetMvc4. Hace un momento escribí
en mi método de prueba y funcionó perfectamente.
Explicación: el método de prueba se ejecuta en un contexto con la configuración de la aplicación tomada, generalmente, una
web.config
omyapp.config
.ConfigurationsManager
puede alcanzar este objeto global de aplicación y manipularlo.Sin embargo: si tiene un corredor de prueba que ejecuta pruebas en paralelo, no es una buena idea.
fuente
ConfigurationManager.AppSettings
es un sistemaNameValueCollection
que no es seguro para subprocesos, por lo que las pruebas paralelas que lo usan sin la sincronización adecuada no son una buena idea de todos modos. De lo contrario, puede llamarConfigurationManager.AppSettings.Clear()
a suTestInitialize
/ ctor y estará dorado.Tal vez no sea lo que necesita lograr, pero ¿ha considerado usar una app.config en su proyecto de prueba? Por lo tanto, ConfigurationManager obtendrá los valores que pones en app.config y no necesitas burlarte de nada. Esta solución funciona bien para mis necesidades, porque nunca necesito probar un archivo de configuración "variable".
fuente
Web.config
proyecto que lo abarca. Durante las pruebas, extraer algunos valores bien conocidos delapp.config
es muy válido. La prueba de la unidad solo necesita asegurarse de que las condiciones cuando se tira dicen "cluster1" funciona; solo hay 4 grupos diferentes en este caso.Puede usar cuñas para modificar
AppSettings
a unNameValueCollection
objeto personalizado . Aquí hay un ejemplo de cómo puede lograr esto:Puede leer más sobre las laminillas y falsificaciones en Aislar el código bajo prueba con falsificaciones de Microsoft . Espero que esto ayude.
fuente
¿Has considerado tropezar en lugar de burlarte? La
AppSettings
propiedad es unNameValueCollection
:Los beneficios son una implementación más simple y sin dependencia del sistema. Configuración hasta que realmente lo necesite.
fuente
IConfiguration
como sugiere Joshua Enfield, puede ser un nivel demasiado alto, y es posible que se pierdan errores que existen debido a cosas como un análisis de valor de configuración incorrecto. Por otro lado, usarConfigurationManager.AppSettings
directamente como sugiere LosManos es demasiado detalle de implementación, sin mencionar que puede tener efectos secundarios en otras pruebas y no puede usarse en pruebas paralelas sin sincronización manual (yaNameValueConnection
que no es seguro para subprocesos).Esa es una propiedad estática, y Moq está diseñado para métodos o clases de instancia de Moq que se pueden burlar mediante herencia. En otras palabras, Moq no te será de ninguna ayuda aquí.
Para simular estadísticas, uso una herramienta llamada Moles , que es gratuita. Hay otras herramientas de aislamiento de marcos, como Typemock que también pueden hacer esto, aunque creo que son herramientas pagas.
Cuando se trata de estadísticas y pruebas, otra opción es crear el estado estático usted mismo, aunque esto a menudo puede ser problemático (como, imagino, sería en su caso).
Y, finalmente, si los marcos de aislamiento no son una opción y usted está comprometido con este enfoque, la fachada mencionada por Joshua es un buen enfoque, o cualquier enfoque en general en el que factorice el código de cliente de esto lejos de la lógica comercial que usted estás usando para probar.
fuente
Creo que escribir su propio proveedor de app.config es una tarea simple y es más útil que cualquier otra cosa. Especialmente debe evitar cualquier falsificación como cuñas, etc. porque tan pronto como los use Editar y continuar ya no funciona.
Los proveedores que uso se ven así:
De manera predeterminada, obtienen los valores de las
App.config
pruebas unitarias, pero puedo anular todos los valores y usarlos en cada prueba de forma independiente.No hay necesidad de ninguna interfaz o implementarla una y otra vez. Tengo un dll de utilidades y uso este pequeño ayudante en muchos proyectos y pruebas unitarias.
fuente
¿Qué tal simplemente configurar lo que necesita? Porque, no quiero burlarme de .NET, ¿no ...?
Probablemente deberías limpiar AppSettings de antemano para asegurarte de que la aplicación solo vea lo que quieres.
fuente