2008-12-05 18 views
122

Pruebo unitario 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.¿Puede un proyecto de prueba unitaria cargar el archivo app.config de la aplicación de destino?

Cuando intento 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 un script para copiar el contenido de la aplicación app.config a un app.config local?

This post kind-of hace esta pregunta pero el autor realmente la está mirando desde un ángulo diferente que yo.

EDIT: Debo mencionar que estoy usando Team System VS08 para mis pruebas unitarias.

Respuesta

50

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

Para hacerlo, abra el archivo .testrunconfig desde sus Elementos de solución. En la sección Implementación, agregue los archivos de salida .config 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 el código dependiente de su configuración funcionará correctamente.

Editar: Olvidé agregar, esto no funcionará en todas las situaciones, por lo que puede necesitar incluir un script de inicio que cambie el nombre de la salida .config para que coincida con el nombre de la prueba de la unidad.

+0

Gracias, que hizo el truco! –

+8

Es mucho más fácil simplemente agregar un app.config fiel al proyecto de prueba; entonces no es necesario que juegues con .testrunconfig en absoluto. –

+11

@Rowland si haces eso, debes mantener dos copias de app.config. Prefiero pasar 10 segundos, una vez, usando la herramienta .testrunconfig que tener que recordar actualizar la aplicación.config en ambos lugares. –

4

Si está utilizando NUnit, eche un vistazo a this post. Básicamente, necesitarás tener tu app.config en el mismo directorio que tu archivo .nunit.

+0

Estoy usando el sistema de equipo VS08 para las pruebas de mi unidad, pero gracias por la sugerencia de NUnit. –

0

Yo uso NUnit y en mi directorio de proyectos 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.

51

Ya sea que esté usando prueba del sistema del equipo o NUnit, lo mejor es crear una biblioteca de clases separadas para sus pruebas. Simplemente agregue un App.config a su proyecto de prueba se copiará automáticamente a su carpeta bin al compilar.

Si el código es dependiente de las pruebas específicas de configuración, la primera prueba de que iba a escribir valida que el archivo de configuración está disponible (modo que sé 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, debe escribir código para 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()); 
    } 
} 
+1

Estoy de acuerdo con el espíritu de pasar la dependencia de configuración aquí, esto parece haber sido respondido, ¡por Mark Seemann nada menos! aquí: [Pruebas de unidades falladas debido a la falta del archivo .config] (http://stackoverflow.com/questions/7288859/ways-of-keeping-configuration-code-out-of-logic-code-using-dependency-injection) – Shaun

+0

Hay una "faltante en la línea: string value = ConfigurationManager.AppSettings [" TestValue]; Traté de solucionarlo, pero tendría que encontrar otros 5 caracteres para corregir para obtener stackoverflow que me permitiera realizar una edición. – Jane

+0

, lo tienes. fijo. – bryanbcook

67

En Visual Studio 2008 que añade el archivo app.config al proyecto de prueba como un elemento existente y selecciona la copia como enlace con el fin de asegurarse de que no está duplicada. De esa manera, solo tengo una copia en mi solución. ¡Con varios proyectos de prueba, es realmente útil!

Add Existing Item

Add As Link

+4

¡Respuesta perfecta, simple y objetiva! +1 – Custodio

+2

Esta es la mejor solución y debe marcarse como la respuesta. – niaher

+0

esto me convenció y es muy fácil – Anton

0

no pude conseguir ninguna de estas sugerencias para trabajar con nUnit 2.5.10, así que terminé usando Proyecto de nUnit -> Editar funcionalidad para especificar el archivo de configuración al objetivo (como otros han dicho que necesita estar en la misma carpeta que el 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)

15

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

Una forma de resolverlo es copiar web.config para probar el proyecto y renombrarlo 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 allí:

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

Y haga clic en Aceptar. (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:

de copia del proyecto actual para el proyecto de la prueba:

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

Una solución realmente agradable. Esto me ayudó a evitar copiar y duplicar archivos '.config'. ¡Gracias por compartir! :) –

+0

Muy buena solución! Muchas gracias. –

2

Si la aplicación está utilizando la configuración como Asp.net ConnectionString es necesario añadir el atributo de tipo de host su método, de lo contrario no se cargarán incluso si tiene un archivo App.Config.

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

} 
3

Esto es muy fácil.

  • Haga clic derecho sobre el proyecto de prueba
  • Agregar -> El actual número
  • Se puede ver una pequeña flecha al lado del botón Añadir
  • Seleccione el archivo de configuración, haga clic en "añadir como Enlace"
6

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 las pruebas unitarias, envuelva la config es una interfaz (iConfig)

para pruebas unitarias, config en realidad no debería ser parte de lo que su prueba de manera a crear una maqueta que se puede 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, añadir 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"); 
Cuestiones relacionadas