web-dev-qa-db-fra.com

Comment configurer LocalDb pour les tests unitaires dans Visual Studio 2012 et Entity Framework 5

Nous avons un projet Visual Studio 2012 ASP.NET MVC utilisant Entity Framework 5.

Certains tests unitaires dépendent d'une base de données. La configuration du fichier app.config dans le projet de test pour utiliser une base de données SQL Server centrale fonctionne correctement.

Cependant, il serait beaucoup plus agréable d'utiliser un LocalDb, afin que chaque développeur ait sa propre base de données lors de l'exécution des tests. D'autant plus que nous aimerions que les tests soient configurés sur DropCreateDatabaseAlways lors de l'exécution.

Cependant, je n'arrive pas à faire fonctionner la configuration. Si j'essaye ceci dans 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" />

Je reçois:

System.Data.SqlClient.SqlException: une erreur d'activation de fichier s'est produite. Le nom de fichier physique "\ unittestdb.mdf" est peut-être incorrect. Diagnostiquez et corrigez les erreurs supplémentaires et recommencez l'opération. Échec de CREATE DATABASE. Certains noms de fichiers répertoriés n'ont pas pu être créés. Vérifiez les erreurs liées.

Il semble que le fichier mdf existe déjà, ce qui semble étrange car il essaie de créer la base de données. La création manuelle d'un fichier mdf ne modifie pas le message d'erreur.

61
Klas Mellbourn

Essayer:

AppDomain.CurrentDomain.SetData(
  "DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ""));

Cela créera un fichier Db sur /bin/Debug/yourdbname.mdf

34
zbw911

J'utiliserais:

// 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));
}

Vous pourriez rencontrer des problèmes en utilisant AppDomain.CurrentDomain.BaseDirectory, utilisez plutôt: context.TestDeploymentDir

10
Jupaol

Gardez à l'esprit que pour un projet de test:

 AttachDBFilename = | DataDirectory | 

signifie qu'il recherchera dans votre dossier output/bin/debug un test unitaire par opposition au dossier App_Data dans votre application web/production/quelque soit.

Vous devez faire deux choses 1. Déplacez le fichier de base de données HORS de votre dossier App_Data vers la racine de votre application de test. 2. Mettez en surbrillance votre base de données afin d'obtenir votre fenêtre de propriétés dans Visual Studio. Définissez l'action de génération sur "Contenu" afin qu'elle soit copiée dans votre dossier de sortie lorsque vous exécutez le projet.

Voila.

3

Je suggère d'utiliser ce code (basé sur la réponse de Jupaol ):

[ClassInitialize]
public static void SetUp(TestContext context)
{
    AppDomain.CurrentDomain.SetData(
        "DataDirectory", 
        context.TestDeploymentDir);
}

Habituellement, cela créera votre base de données dans TestResults\<test run>\Out\ dossier de votre solution.

1
Davide Icardi

J'ai trouvé votre question en cherchant la réponse au problème. En utilisant EntityFramework avec nUnit dans un projet distinct, j'ai dû changer App.config

ressemblait à ceci:

<?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>
0