2009-10-08 10 views
22

El objetivo es ejecutar algunas pruebas dado algunos datos en esos archivos Xml.Visual Studio - La unidad prueba la carga de recursos en el proyecto

¿Cómo cargaría fácilmente un archivo Xml dado en un XmlDoc dentro de los métodos de prueba de la unidad?

estado actual es:

XmlDocument doc = new XmlDocument(); 
    string xmlFile = "4.xml"; 
    string dir = System.IO.Directory.GetCurrentDirectory() + @"\Msgs\" 

    //dir is then the value of the current exe's path, which is 
    //d:\sourcecode\myproject\TestResults\myComputer 2009-10-08 16_07_45\Out 

    //we actually need: 
    //d:\sourcecode\myproject\Msgs\ 
    doc.Load(dir + fileName); //should really use System.IO.Path.Combine()! 

¿Es sólo una simple cuestión de poner ese camino en un app.config? Esperaba evitar eso, dado el posibilidad de caminos diferentes en máquinas de desarrollador.

Pregunta: ¿Cómo escribirías el algoritmo para cargar un archivo Xml dado en un XmlDocument en el método de prueba de la unidad?

Respuesta

9

En el proyecto de prueba de unidad, agregue un evento de creación posterior que copie el archivo XML en el directorio de salida. Luego, puede usar su código original para obtener el archivo XML.

evento acumulación

El puesto se parecerá a algo como esto:

copy $(SolutionDir)file.xml $(ProjectDir)$(OutDir)file.xml 

También puede ser necesario esto para añadir a su ruta:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) 
+14

Estoy descubriendo que mi archivo va a "Project1_UnitTests \ bin \ Debug" mientras que la prueba intenta encontrarlo en "TestResults \ Username_PCName_datetime \ Out" .. ??? – Greg

+0

por las 6 votaciones ascendentes en el comentario de @ Greg, he editado esta respuesta y agregado en la información adicional para que esta respuesta sea más completa. – javamonkey79

+1

@ javamonkey79 Eso no ayuda a java –

0

Simplemente pondría la ruta en el app.config y cargaré desde la ruta predeterminada. En mi equipo, soy anal con los desarrolladores que cambian las rutas, por eso hago que todos mis desarrolladores tengan los mismos caminos y archivos en sus computadoras, así que no tengo problemas con que un desarrollador deshonesto cambie la ruta de acceso a su espacio de trabajo.

Por ejemplo, todos los desarrolladores de mi equipo deben usar C: \ Proyecto \ Producto \ Módulo, etc. etc. También me aseguro de que todo el software instalado sea estándar. De esta manera, puedo fantasma de cualquier máquina en cualquier otro fácilmente.

22

Puede construir esos archivos en su ejecutable (establezca su propiedad "Build Action" en "Recurso incrustado") y luego consígalos usando el Assembly.GetManifestResourceStream method.

+0

Patrick Cauldwell tiene un interesante artículo sobre eso [http://www.cauldwell.net/patrick/blog/TestingWithExternalFiles.aspx](http://www.cauldwell.net/patrick/blog/TestingWithExternalFiles.aspx) –

4

utilizo una clase de ayuda para hacer frente a conseguir básica caminos a los que podría querer acceder en mis Pruebas Unitarias.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Brass9.Testing 
{ 
    public static class TestHelper 
    { 
     public static string GetBinPath() 
     { 
      return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
     } 

     public static string GetProjectPath() 
     { 
      string appRoot = GetBinPath(); 
      var dir = new DirectoryInfo(appRoot).Parent.Parent.Parent; 
      var name = dir.Name; 
      return dir.FullName + @"\" + name + @"\"; 
     } 

     public static string GetTestProjectPath() 
     { 
      string appRoot = GetBinPath(); 
      var dir = new DirectoryInfo(appRoot).Parent.Parent; 
      return dir.FullName + @"\"; 
     } 

     public static string GetMainProjectPath() 
     { 
      string testProjectPath = GetTestProjectPath(); 
      // Just hope it ends in the standard .Tests, lop it off, done. 
      string path = testProjectPath.Substring(0, testProjectPath.Length - 7) + @"\"; 
      return path; 
     } 
    } 
} 

A veces mis interacciones con las rutas son más complejas; A menudo utilizo una clase central que denomino "Aplicación" para indicar algunos detalles básicos sobre la aplicación, como su carpeta raíz, su espacio de nombres y módulo raíz, etc. Las clases a veces dependerán de la existencia de la aplicación, y en su lugar colocaré un init método en la aplicación que usa código como el anterior para inicializarse para los arneses de prueba, y llama a ese método desde el comando Init en una prueba unitaria.

(Actualizado)

respuesta Antiguo

He encontrado que esto ayuda a conseguir caminos arbitrarios para acceder a los archivos en la carpeta del proyecto tiene la intención de probar (en contraposición a los archivos en la carpeta del proyecto de prueba, que puede hacer busywork si necesitas copiar las cosas).

DirectoryInfo projectDir = new DirectoryInfo(@"..\..\..\ProjectName"); 
string projectDirPath = projectDir.FullName; 

Puede utilizar cualquiera de estas variables para acceder a lo que necesite del proyecto relacionado. Obviamente, cambie "ProjectName" por el nombre real de su proyecto.

+0

O, si su ruta de acceso se ve como "TestResults \ Username_PCName_datetime \ Out", puede usar 'ProjectDir = new System.IO.DirectoryInfo (@" .. \ .. \ .. \ .. \ .. \ .. \ ProjectName ");' –

+0

He tenido problemas al usar este método. Un camino funcionará para el corredor de MS Test, pero para otros corredores podría no funcionar.Por ejemplo, algunos desarrolladores usaban ** MS Test Runner ** y algunos ** ReSharper ** y las rutas de prueba eran diferentes (\ TestResults \\) y fallaban en uno u otro sentido. Corregido por un truco:/ –

24

Hay una característica de Visual Studio Unidad de Pruebas para esto: DeploymentItemAttribute

utilizo esta función para copiar todos los archivos XML en una carpeta de proyecto dada a la carpeta de salida de prueba de unidad, antes de comprobar si todos los archivos necesarios están presentes.

Puede usar este atributo con las pruebas de su unidad para copiar archivos específicos de la carpeta Proyecto (o en cualquier otro lugar) a la carpeta de resultados de la Prueba de unidad. De este modo:

[TestMethod()] 
[DeploymentItem("MyProjectFolder\\SomeDataFolder\\somefile.txt", "SomeOutputSubdirectory")] 
public void FindResourcefile_Test() 
{ 
    string fileName = "SomeOutputSubdirectory\\somefile.txt"; 
    Assert.IsTrue(System.IO.File.Exists(fileName)); 
} 

También puede copiar el contenido de las carpetas enteras:

[TestMethod()] 
[DeploymentItem("MyProjectFolder\\SomeDataFolder\\", "SomeOutputSubdirectory")] 
public void FindResourcefile_Test() 
{ 
    string fileName = "SomeOutputSubdirectory\\someOtherFile.txt"; 
    Assert.IsTrue(System.IO.File.Exists(fileName)); 
} 

El primer parámetro es la fuente, el segundo la carpeta de destino. La fuente es relativa a su carpeta de solución (para que pueda acceder al proyecto de prueba de unidad del proyecto que se está probando) y el destino es relativo a la carpeta de salida del ensamblaje de prueba de unidad.

ACTUALIZACIÓN:

Necesita habilitar despliegue en la configuración de prueba para que esto funcione. Esta página de MSDN explica cómo (es realmente fácil): http://msdn.microsoft.com/en-us/library/ms182475(v=vs.90).aspx#EnableDisableDeploy

+0

Esto no funciona con ** NUnit **. 'DeploymentItemAttribute' está en' Microsoft.VisualStudio.TestTools.UnitTesting' – Jess

+0

Tenga en cuenta que debe establecer la propiedad "copiar a salida" del archivo que desea utilizar: selecciónelos en el Explorador de soluciones y configure la propiedad Copiar a salida en Copiar si Más nuevo. Vea este enlace: https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.deploymentitemattribute(v=vs.140).aspx – Allie

0

Creo que en VS.NET 2012 el atributo DeploymentItem funciona sin ninguna configuración de configuración de prueba.

1

Los recursos son solo recursos y eso es todo, no hay necesidad de complicarlos. Si no desea incrustarlos, puede agregar estos archivos como recursos de "Contenido" a su proyecto y configurarlos en Copy always. A continuación, especifique la subcarpeta en el código:

var xmlDoc = XElement.Load("ProjectSubFolder\\Resource.xml"); 

Esto cargará automáticamente los recursos de la producción del proyecto (que se ejecuta lugar de montaje) bin\$(Configuration)\ResourceSubfolder\

Esto funciona para todo tipo de proyectos, no sólo las pruebas unitarias.

Cuestiones relacionadas