¿Cómo hacer referencia a archivos de prueba de pruebas de Xunit en Visual Studio?
Estamos usando Xunit para realizar pruebas. Estamos ejecutando nuestras pruebas a través del Test Runner integrado de Visual Studio 2013, utilizando el complemento Xunit.
El problema es que algunas de las pruebas necesitan hacer referencia a archivos en el sistema de archivos . Parece que Xunit (o VS Test Runner, no estoy seguro de cuál), copia los ensamblados, pero no los archivos de soporte en el directorio bin, a otro directorio antes de ejecutar las pruebas, por lo que no se encuentran nuestros archivos de prueba. [El marco de MS Testing especifica atributos para enumerar los archivos que se copiarán, pero Xunit no.]
¿Cómo deshabilitar este comportamiento de copia o determinar mediante programación la bin/
ubicación del directorio original para recuperar los archivos?
Parece que la mayoría de las soluciones propuestas (incluso en el sitio de seguimiento de errores de Xunit) sugieren almacenar los archivos como recursos integrados en lugar de archivos de "copiar siempre". Sin embargo, esto no siempre es práctico, por ejemplo: probar código de manipulación de archivos y (en un caso) código que quiere un archivo de base de datos Sqlite.
Después de buscar un poco, encontré la solución aquí: https://msdn.microsoft.com/en-us/library/ms182475.aspx .
Particularmente, el primer paso me ha sido suficiente:
Si son específicos de un proyecto de prueba, inclúyalos como archivos de contenido en el proyecto de prueba de Visual Studio. Selecciónelos en el Explorador de soluciones y establezca la propiedad Copiar en salida en Copiar si es más reciente.
asociado al siguiente código:
var filename = "./Resources/fake.pdf";
var stream = File.OpenRead(filename);
Bien, típico, tan pronto como publico la pregunta, encuentro la respuesta yo mismo...
La esencia es que la copia (copia instantánea) de ensamblados parece ser realizada por el marco .NET, no por Visual Studio o Xunit.
Habíamos estado usando Assembly.Location
para ubicar el archivo de ensamblaje y, por lo tanto, los archivos de prueba. Sin embargo, esto estuvo mal, ya que nos dio la ubicación de los ensamblajes copiados en sombra en lugar de los originales.
En su lugar, debe utilizar Assembly.CodeBase
para buscar la ubicación del código ensamblador base. Sin embargo, esta es una URL (de archivo), por lo que es necesario extraer la ruta de la URL. El nuevo código (C#) tiene este aspecto:
var codeBaseUrl = new Uri(Assembly.GetExecutingAssembly().CodeBase);
var codeBasePath = Uri.UnescapeDataString(codeBaseUrl.AbsolutePath);
var dirPath = Path.GetDirectoryName(codeBasePath);
return Path.Combine(dirPath, relativePath);
…¿dónde relativePath
está la ruta relativa al Bin\
directorio?
A partir de .NET5
(quizás antes), CodeBase
ya no funciona, por lo que la solución ahora es copiar primero todos sus archivos al directorio bin y usarlo como su ubicación conocida.
Lo que hace que esto esté bien ahora, lo que siempre fue una molestia total en el pasado, es que puede copiar fácilmente un directorio a su carpeta bin desde su csproj
archivo.
<ItemGroup>
<None
Include="TestFiles\**"
CopyToOutputDirectory="PreserveNewest"
LinkBase="TestFiles\" />
</ItemGroup>
Dónde TestFiles
está en la raíz de la carpeta de su proyecto. Ahora puede acceder a estos archivos con el siguiente método auxiliar.
public static class TestUtils
{
public static string GetTestPath(string relativePath)
{
var codeBaseUrl = new Uri(Assembly.GetExecutingAssembly().Location);
var codeBasePath = Uri.UnescapeDataString(codeBaseUrl.AbsolutePath);
var dirPath = Path.GetDirectoryName(codeBasePath);
return Path.Combine(dirPath, "TestFiles", relativePath);
}
}