¿Cómo haría para cambiar una cadena de conexión para acceder a una base de datos de prueba para pruebas unitarias?

StackOverflow https://stackoverflow.com/questions/1027155

Pregunta

He configurado una base de datos de prueba para comenzar la prueba unitaria de una aplicación a la que me han agregado recientemente. Es un diseño de 3 niveles (capa de presentación, BOL y DAL) y esta es la primera vez que escribo pruebas unitarias.

Decidí comenzar en el BOL y creo que la mejor manera es cambiar la ConnectionString (que se ha pasado como una Cadena compartida) con una que apunta a mi nueva base de datos de prueba. Sin embargo, no deseo cambiar ningún código de producción. Simplemente deseo de alguna manera redirigir la aplicación a la base de datos de prueba durante las pruebas unitarias. ¿Cómo podría lograr esto?

¿Fue útil?

Solución

Lo que suelo hacer es crear una sección de configuración que contenga la funcionalidad para determinar qué cadena de conexión usar.

Aquí hay un ejemplo básico:

static ConfigurationSettings
{
     static String ConnectionString
     {
        get
        {
           var result = "TESTCONNECTIONSTRING";
           if (ConfigurationManager.ConnectionStrings["SOMEKEY"] != null)
               result = ConfigurationManager.ConnectionStrings["SOMEKEY"];
           return result;
     }
}

De esta manera, no tengo que preocuparme por cómo conectarme al sistema, y ??también puedes anular este comportamiento en tus pruebas para lograr lo que deseas agregando un setter.

La razón por la que no tomo la ruta del archivo de configuración múltiple, es que no puedo usar los archivos de configuración cuando se ejecuta en un conjunto de pruebas (como el testrunner NUnit).

Otros consejos

¿Su cadena de conexión proviene de un archivo de configuración? ¿Puedes configurar una configuración coincidente en tus pruebas unitarias?

Como probablemente pronto aprenderá de todos modos, el código estático / compartido se considera malvado en las pruebas unitarias, por varias razones. Una de estas razones es que es difícil cambiar los valores durante las pruebas unitarias.

Es una idea mucho mejor pasar sus Dependencias explícitamente a su Sistema bajo prueba (SUT), preferiblemente en el constructor. En su caso, debe pasar la cadena de conexión al SUT a través de su constructor.

Un enfoque aún mejor sería abstraer la capa de acceso a datos detrás de una interfaz y pasar una instancia de esa interfaz al SUT.

He escrito un poco sobre Configuración Imperativa , pero en general, debería leer el libro de Roy Osherove El arte de las pruebas unitarias : trata muchos de estos problemas.

Es una práctica común mantener las cadenas de conexión en un archivo de configuración. Si hace esto, simplemente use diferentes archivos de configuración en diferentes contextos.

También existe la posibilidad si no lo hace (pero puede que tenga que cambiar el código de producción). Deje que la cadena de conexión se inyecte a través de un constructor o un setter. Luego, en producción, usa la cadena de conexión de producción; y en las pruebas, puede conectarse a su base de datos de prueba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top