61 votes

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 centrale SQL Server fonctionne bien.

Cependant, il serait beaucoup plus agréable d'utiliser une LocalDb, de sorte que chaque développeur dispose de 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 pour DropCreateDatabaseAlways en cours d'exécution.

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

J'ai compris :

System.Data.SqlClient.SqlException : Une erreur d'activation de fichier s'est produite. Le nom du fichier physique ' \unittestdb.mdf peut être incorrect. Diagnostiquez et corrigez les erreurs supplémentaires, puis réessayez l'opération. CRÉER DATABASE a échoué. Certains noms de fichiers répertoriés n'ont pas pu être créés. Vérifiez les erreurs liées.

On dirait qu'il veut que le fichier mdf existe déjà, ce qui semble étrange puisqu'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.

34voto

zbw911 Points 179

Essayez :

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

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

10voto

Jupaol Points 12825

Je l'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

3voto

Adam Tuliper - MSFT Points 22478

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

AttachDBFilename=|DataDirectory|

signifie qu'il cherchera un test unitaire dans votre dossier de sortie /bin/debug plutôt que dans le dossier App_Data de votre application web/production/autre.

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

Voila.

1voto

Davide Icardi Points 2215

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\ de votre solution.

0voto

J'ai trouvé votre question en cherchant une réponse à ce problème. En utilisant EntityFramework avec nUnit dans un autre projet, j'ai dû modifier le fichier App.config.

ressemblait à ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X