unit testing - hacer - Cómo configurar LocalDb para pruebas unitarias en Visual Studio 2012 y Entity Framework 5
pruebas unitarias c# visual studio 2017 (5)
Tenemos un proyecto Visual Studio 2012 ASP.NET MVC utilizando Entity Framework 5.
Hay algunas pruebas unitarias que dependen de una base de datos. Configurar el archivo app.config en el proyecto de prueba para usar una base de datos central de SQL Server funciona bien.
Sin embargo, sería mucho mejor usar un LocalDb, de modo que cada desarrollador tenga su propia base de datos al ejecutar las pruebas. Especialmente porque nos gustaría tener las pruebas configuradas para DropCreateDatabaseAlways
cuando se ejecuta.
Sin embargo, no puedo hacer que la configuración funcione. Si pruebo esto en app.config:
<add name="TestDb"
connectionString="Data Source=(LocalDb)/v11.0;Initial Catalog=unittestdb;
Integrated Security=SSPI;AttachDBFilename=|DataDirectory|/unittestdb.mdf"
providerName="System.Data.SqlClient" />
Yo obtengo:
System.Data.SqlClient.SqlException: Se produjo un error de activación de archivo. El nombre de archivo físico ''/ unittestdb.mdf'' puede ser incorrecto. Diagnostique y corrija errores adicionales, y vuelva a intentar la operación. CREATE DATABASE falló. Algunos de los nombres de archivos en la lista no se pudieron crear. Verificar errores relacionados.
Parece que ya quiere que el archivo mdf ya exista, lo que parece extraño ya que está intentando crear la base de datos. Crear un archivo mdf manualmente no cambia el mensaje de error.
Encontré tu pregunta mientras buscaba una respuesta al problema. Usando EntityFramework con nUnit en un proyecto separado, tuve que cambiar la App.config
se veía así:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
Sugiero usar este código (basado en la respuesta de Jupaol ):
[ClassInitialize]
public static void SetUp(TestContext context)
{
AppDomain.CurrentDomain.SetData(
"DataDirectory",
context.TestDeploymentDir);
}
Por lo general, esto creará su base de datos dentro de la TestResults/<test run>/Out/
de su solución.
Tenga en cuenta que para un proyecto de prueba:
AttachDBFilename=|DataDirectory|
significa que se verá en su carpeta de salida / bin / depuración para una prueba unitaria en lugar de la carpeta App_Data en su aplicación web / producción / lo que sea.
Necesita hacer dos cosas: 1. Mueva el archivo de la base de datos FUERA de su carpeta App_Data a su raíz de su aplicación de prueba. 2. Resalte su base de datos para que obtenga su ventana de propiedades en Visual Studio. Establezca la acción de compilación en "Contenido" para que se copie en su carpeta de salida cuando ejecuta el proyecto.
Voila.
Tratar:
AppDomain.CurrentDomain.SetData(
"DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ""));
Esto creará el archivo Db en /bin/Debug/yourdbname.mdf
Yo usaría:
// Declare this property - this is set by MSTest
public TestContext TestContext { get; set; }
// In test initialization - note the signature should be exactly this
// A static void method with one argument of type TestContext
[ClassInitialize]
public static void SetUp(TestContext context)
{
AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(context.TestDeploymentDir, string.Empty));
}
Podría tener problemas al usar AppDomain.CurrentDomain.BaseDirectory
, en su lugar use: context.TestDeploymentDir