visual usar obtener net modificar guardar example datos conexion cadena app c# .net unit-testing app-config

c# - usar - ¿Puede un proyecto de prueba unitaria cargar el archivo app.config de la aplicación de destino?



modificar cadena de conexion en app.config c# (11)

Estoy probando la unidad de una aplicación .NET (.exe) que utiliza un archivo app.config para cargar las propiedades de configuración. La aplicación de prueba unitaria no tiene un archivo app.config.

Cuando trato de probar la unidad de un método que utiliza cualquiera de las propiedades de configuración, devuelven nulo . Supongo que esto se debe a que la aplicación de prueba de la unidad no se va a cargar en la aplicación de destino app.config.

¿Hay alguna manera de anular esto o tengo que escribir una secuencia de comandos para copiar el contenido de la app.config de destino a una app.config local?

This tipo de post hace esta pregunta, pero el autor realmente la está mirando desde un ángulo diferente al que yo estoy.

EDITAR: Debo mencionar que estoy usando el sistema de equipo VS08 para mis pruebas unitarias.


En Visual Studio 2008 agregué el archivo app.config al proyecto de prueba como un elemento existente y app.config seleccionado como enlace para asegurarme de que no esté duplicado. De esa manera, solo tengo una copia en mi solución. ¡Con varios proyectos de prueba, es realmente útil!


Esto es muy facil.

  • Haga clic derecho en su proyecto de prueba
  • Agregar -> elemento existente
  • Puedes ver una pequeña flecha justo al lado del botón Agregar
  • Seleccione el archivo de configuración, haga clic en "Agregar como enlace"

Esto es un poco viejo, pero encontré una mejor solución para esto. Estaba intentando la respuesta elegida aquí, pero parece que .testrunconfig ya está obsoleto.

1. Para pruebas unitarias, ajuste la configuración es una interfaz (IConfig)

para las pruebas unitarias, la configuración realmente no debería ser parte de lo que prueba, así que cree una simulación que pueda inyectar. En este ejemplo, estaba usando Moq.

Mock<IConfig> _configMock; _configMock.Setup(config => config.ConfigKey).Returns("ConfigValue"); var SUT = new SUT(_configMock.Object);

2. Para la prueba de integración, agregue dinámicamente la configuración que necesita

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); if(config.AppSettings.Settings[configName] != null) { config.AppSettings.Settings.Remove(configName); } config.AppSettings.Settings.Add(configName, configValue); config.Save(ConfigurationSaveMode.Modified, true); ConfigurationManager.RefreshSection("appSettings");


No pude obtener ninguna de estas sugerencias para trabajar con nUnit 2.5.10, así que terminé usando nUnit''s Project -> Edit funcionalidad para especificar el archivo de configuración para destino (como otros han dicho que debe estar en la misma carpeta que. archivo nunit en sí). El lado positivo de esto es que puedo darle al archivo de configuración un nombre Test.config que lo hace mucho más claro de lo que es y por qué es)



Si está usando NUnit, eche un vistazo a esta publicación . Básicamente, necesitarás tener tu app.config en el mismo directorio que tu archivo .nunit.


Si su aplicación usa configuración como Asp.net ConnectionString, debe agregar el atributo HostType a su método, de lo contrario no se cargarán aunque tenga un archivo App.Config.

[TestMethod] [HostType("ASP.NET")] // will load the ConnectionString from the App.Config file public void Test() { }


Si tiene una solución que contiene, por ejemplo, la Aplicación web y el Proyecto de prueba, probablemente desee que Test Project utilice la aplicación web web.config.

Una forma de resolverlo es copiar web.config para probar el proyecto y cambiarle el nombre como app.config.

Otra solución mejor es modificar la cadena de compilación y hacer una copia automática de web.config para probar el directorio de salida de los proyectos. Para hacerlo, haga clic con el botón derecho en Probar aplicación y seleccione propiedades. Ahora debería ver las propiedades del proyecto. Haga clic en "Crear eventos" y luego haga clic en el botón "Editar publicación posterior ...". Escriba la siguiente línea para allí:

copy "$(SolutionDir)/WebApplication1/web.config" "$(ProjectDir)$(OutDir)$(TargetFileName).config"

Y haz clic en OK. (Tenga en cuenta que probablemente necesite cambiar WebApplication1 como nombre de proyecto que desea probar). Si tiene una ruta incorrecta a web.config, la copia falla y la notará durante la compilación no exitosa.

Editar:

Para copiar desde el Proyecto actual al Proyecto de prueba:

copy "$(ProjectDir)bin/WebProject.dll.config" "$(SolutionDir)WebProject.Tests/bin/Debug/App.Config"


Uso NUnit y en mi directorio de proyecto tengo una copia de mi App.Config que cambio alguna configuración (ejemplo, redirijo a una base de datos de prueba ...). Debe tenerlo en el mismo directorio del proyecto probado y estará bien.


Ya sea que esté utilizando Team System Test o NUnit , la mejor práctica es crear una biblioteca de clases separada para sus pruebas. Simplemente agregando un App.config a su proyecto de prueba se copiará automáticamente a su carpeta bin cuando compile .

Si su código depende de pruebas de configuración específicas, la primera prueba que escribiría valida que el archivo de configuración esté disponible ( para que sepa que no estoy loco ):

<configuration> <appSettings> <add key="TestValue" value="true" /> </appSettings> </configuration>

Y la prueba:

[TestFixture] public class GeneralFixture { [Test] public void VerifyAppDomainHasConfigurationSettings() { string value = ConfigurationManager.AppSettings["TestValue"]; Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found."); } }

Idealmente, debería escribir código de modo que sus objetos de configuración pasen a sus clases. Esto no solo lo separa del problema del archivo de configuración, sino que también le permite escribir pruebas para diferentes escenarios de configuración.

public class MyObject { public void Configure(MyConfigurationObject config) { _enabled = config.Enabled; } public string Foo() { if (_enabled) { return "foo!"; } return String.Empty; } private bool _enabled; } [TestFixture] public class MyObjectTestFixture { [Test] public void CanInitializeWithProperConfig() { MyConfigurationObject config = new MyConfigurationObject(); config.Enabled = true; MyObject myObj = new MyObject(); myObj.Configure(config); Assert.AreEqual("foo!", myObj.Foo()); } }


La forma más sencilla de hacerlo es agregar el archivo .config en la sección de implementación en su prueba de unidad.

Para hacerlo, abra el archivo .testrunconfig desde sus Elementos de solución. En la sección Implementación, agregue los archivos .config salida del directorio de compilación de su proyecto (presumiblemente bin/Debug ).

Todo lo que figura en la sección de implementación se copiará en la carpeta de trabajo del proyecto de prueba antes de que se ejecuten las pruebas, por lo que su código dependiente de la configuración funcionará correctamente.

Editar: Olvidé agregar, esto no funcionará en todas las situaciones, por lo que es posible que deba incluir un script de inicio que renombre el resultado .config para que coincida con el nombre de la prueba de la unidad.