2010-12-02 19 views
25

Acabo de empezar a trabajar con NUnit para proporcionar cierta cobertura de prueba para mis proyectos.Problema con NUnit al determinar el directorio del ensamblaje

Dentro de mi library.dll principal necesito cargar los datos de configuración de un archivo externo que vaya con la biblioteca, library.xml.

Esto funciona bien cuando estoy usando la biblioteca, porque el uso de estos procedimientos para obtener el directorio en el que se buscará el archivo de configuración:

string settingspath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 

El problema que he notado es que cuando Estoy probando mi unidad con NUnit, copia mis ensamblajes a Shadow Copy, pero no lleva consigo ninguno de los otros archivos, por lo que mi init falla debido a la falta de archivos de configuración.

¿Debo hacer algo diferente para localizar los archivos de configuración desde mi biblioteca? (es una aplicación de servidor, y no quiero usar la configuración de la aplicación estándar, o la configuración local del usuario, etc.)

+0

supongo que ya que es una biblioteca, posiblemente debería tener todo este tipo de cosas externalizadas por propiedades, pero el problema es que mi dll requiere varios archivos (externos) para estar presente en una ubicación relativa a la aplicación. – Cylindric

Respuesta

-10

Cuando se realizan pruebas unitarias, generalmente se recomienda evitar dependencias externas como el sistema de archivos y las bases de datos, burlándose o anulando las rutinas que las llaman; de ese modo, las pruebas serán más localizadas, menos frágiles y más rápidas. Vea si puede eliminar las dependencias proporcionando información de configuración falsa.

+0

Aunque esta respuesta se marca como correcto, me parece que la respuesta de Gishu en la parte inferior es mejor ya que permite determinar la ubicación de la asamblea compilado en lugar de su ubicación de copia de sombra. Esa fue la respuesta correcta para mí de todos modos, y está en línea con la guía NUnit (http://www.nunit.org/index.php?p=optionsDialog&r=2.4). – Philippe

+1

Como un comentario que había 1 esta observación, como una respuesta que no es útil para mí, sin embargo (estoy usando NUnit para ejecutar algunas pruebas de integración, para bien o para mal, y esta respuesta * no * me ayude a conseguir que trabajar). – Jeroen

19

Para usar archivos de referencia en mis pruebas de unidad, utilizo Assembly.Codebase que funciona incluso si Shadow Copying está prendido. Puede intentarlo ...

Devuelve una cadena en formato URI ... por lo que necesitaría crear una instancia de Uri a partir de la cadena de código base y usar Uri.LocalPath para obtener la ruta de la carpeta real.

Sin embargo, para el código de producción, BaseFolder debe recuperarse de un lugar conocido (por ejemplo, una clave del Registro establecida a través del instalador en Windows). Todas las búsquedas de archivos deben enrutarse desde este baseFolder.

+0

Esa es la respuesta correcta para mí. – Philippe

+0

Para cualquier otra persona que lea esto, vea la respuesta de Jeff Lewis a continuación. Las nuevas versiones de Nunit hacer esto mejor – Andy

1

puede desactivar la copia oculta en la línea de comandos con el interruptor /noshadow. Las opciones de línea de comando están documentadas here

¿El archivo externo está configurado para formar parte de la compilación de su dll? Si lo incluye en el proyecto y lo configura para copiar siempre en Copiar a la salida en las propiedades del archivo, entonces debería ir al directorio de la sombra, creo.

Esto puede ayudarlo.

+0

El mayor problema con el que me he encontrado es que NUnit bloquea el conjunto, por lo que no pueden volver a compilar el proyecto sin descargar NUnit. – Cylindric

12

Incluso si la copia oculta está activa, AppDomain.CurrentDomain.BaseDirectory apunta a la ubicación original de las DLL de prueba.

Sin embargo, si puede incrustar los datos de prueba como recursos en su archivo DLL es mucho más seguro, ya que no hay archivos adicionales que se pueden perder.

+0

Sí, problema es que son archivos de configuración que necesitan ser editable por el usuario, y es la engine.dll que carga su propia configuración, que es la iglesia bajo prueba, por lo que es shadowcopied en otro lugar. Huele mal como está, por lo que moveré el parámetro de configuración al externo para que el DLL resultante no tenga su propio "smarts" en este aspecto. – Cylindric

0

Incluimos el recurso de prueba en el proyecto de prueba (en este caso en una carpeta 'TestData').

En Visual Studio para que el recurso de acceso en la marca de prueba In Visual Studio for the resource to access in the test mark

Al proyecto se basa deja la imagen de la 'bin \ Debug' carpeta When project builds leaves the image on the 'bin\Debug' folder

y se escribe el camino

string fullImagePath = @".\TestData\vcredist.bmp"; 
42

Uso puede usar TestContext.CurrentContext.TestDirectoryas mentioned by Charlie Poole from NUnit here:

La necesidad de acceder a los archivos en el mismo directorio que el conjunto de prueba es la razón más comúnmente citada para la desactivación de instantáneas. Sin embargo, esto es espurio.

NUnit no copia ningún asambleas: la instantánea es una función de .NET sí. En consecuencia, el problema debe ser visto como "¿Cómo puedo acceder al archivo donde está?" en lugar de "¿Cómo puedo obtener el archivo copiado donde creo que debería estar?"

Hay tres maneras de localizar un archivo que se encuentra en el mismo directorio que el conjunto de :

1) Uso Assembly.Codebase - esto le dará la ubicación como un URI, que debe entonces tranform a un camino apropiado.

2) Utilice el directorio actual, que NUnit ha establecido históricamente en el directorio que contiene el ensamblaje de prueba en ejecución. Sin embargo, esto puede no ser cierto para futuras versiones.

3) Use TestContext.CurrentContext.TestDirectory de NUnit, que es el disponible en las versiones más recientes.

Todos estos enfoques realmente usan Assembly.Codebase bajo las cubiertas , con NUnit haciendo el trabajo de transformar correctamente el URI en # 2 y # 3. El enfoque común de utilizar Assembly.Location es incorrecto, a menos que realmente desea que la ubicación de la copia de la sombra caché.

+2

^^^^^ ESTA ES LA RESPUESTA CORRECTA ^^^^^. Nunit ya hace el trabajo de convertir Assembly.Codebase a un camino para que – Andy

+3

Esto no funciona si desea utilizar el directorio actual para enumerar los casos de prueba desde 'TestCaseSource' tiene que hacer referencia a una propiedad'/campo/método static' ahora. En el punto donde se evalúa, 'TestContext.CurrentContext' no está configurado. – filmor

+0

Muy práctico, mantiene el ensayo limpio –

0

encontrado el mismo problema ... Lo que sigue es mi entrenamiento:

Antes de la carrera SUT, actualizar el directorio de base de dominio de aplicación de esta manera ....

String root_path = "{{your path}}"; 
AppDomain.CurrentDomain.SetData("APPBASE", root_path); 
Cuestiones relacionadas