web-dev-qa-db-fra.com

Un projet de test unitaire peut-il charger le fichier app.config de l'application cible?

Je suis en train de tester une application .NET (.exe) qui utilise un fichier app.config pour charger les propriétés de configuration. L'application de test unitaire n'a pas de fichier app.config.

Lorsque j'essaie de tester une méthode qui utilise l'une des propriétés de configuration, elles renvoient null. Je suppose que c'est parce que l'application de test unitaire ne va pas se charger dans le fichier app.config de l'application cible.

Existe-t-il un moyen de le remplacer ou dois-je écrire un script pour copier le contenu du fichier app.config cible dans un fichier app.config local?

This post kind-of pose cette question mais l'auteur l'exprime vraiment sous un angle différent de celui que je suis.

EDIT: Je dois mentionner que j'utilise VS08 Team System pour mes tests unitaires.

143
Jordan Parmer

La manière la plus simple de faire est d’ajouter le .config fichier dans la section de déploiement de votre test unitaire.

Pour ce faire, ouvrez le .testrunconfig fichier de vos éléments de solution. Dans la section Déploiement, ajoutez le résultat .config fichiers du répertoire de construction de votre projet (probablement bin\Debug).

Tout ce qui est répertorié dans la section de déploiement sera copié dans le dossier de travail du projet de test avant l'exécution des tests, de sorte que votre code dépendant de la configuration s'exécutera correctement.

Edit: j’ai oublié d’ajouter, cela ne fonctionnera pas dans toutes les situations; vous devrez donc peut-être inclure un script de démarrage qui renomme la sortie .config pour correspondre au nom du test unitaire.

55
Jeromy Irvine

Dans Visual Studio 2008, j'ai ajouté le app.config fichier dans le projet de test en tant qu’élément existant et copie sélectionnée en tant que lien afin de s’assurer qu’il n’est pas dupliqué. De cette façon, je n'ai qu'une copie dans ma solution. Avec plusieurs projets de test, il est vraiment utile!

Add Existing Item

Add As Link

92
Geoffroy Seive

Que vous utilisiez Test du système d'équipe ou NUnit, la meilleure pratique consiste à créer une bibliothèque de classes distincte pour vos tests. Ajouter simplement un App.config à votre projet test sera automatiquement copié dans votre dossier bin lors de la compilation .

Si votre code repose sur des tests de configuration spécifiques, le tout premier test que j'écris confirme que le fichier de configuration est disponible (, de sorte que je sais que je ne suis pas fou ):

<configuration>
   <appSettings>
       <add key="TestValue" value="true" />
   </appSettings>
</configuration>

Et le test:

[TestFixture]
public class GeneralFixture
{
     [Test]
     public void VerifyAppDomainHasConfigurationSettings()
     {
          string value = ConfigurationManager.AppSettings["TestValue"];
          Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found.");
     }
}

Idéalement, vous devriez écrire du code de sorte que vos objets de configuration soient transmis à vos classes. Cela vous sépare non seulement du problème du fichier de configuration, mais vous permet également d'écrire des tests pour différents scénarios de configuration.

public class MyObject
{
     public void Configure(MyConfigurationObject config)
     {
          _enabled = config.Enabled;
     }

     public string Foo()
     {
         if (_enabled)
         {
             return "foo!";
         }
         return String.Empty;
     }

     private bool _enabled;
}

[TestFixture]
public class MyObjectTestFixture
{
     [Test]
     public void CanInitializeWithProperConfig()
     {
         MyConfigurationObject config = new MyConfigurationObject();
         config.Enabled = true;

         MyObject myObj = new MyObject();
         myObj.Configure(config);

         Assert.AreEqual("foo!", myObj.Foo());
     }
}
53
bryanbcook

Si votre solution contient, par exemple, une application Web et un projet de test, vous souhaiterez probablement que ce projet de test utilise le fichier Web.config de l'application Web.

Une solution consiste à copier web.config pour tester le projet et à le renommer en app.config.

Une autre solution, plus efficace, consiste à modifier la chaîne de construction et à créer une copie automatique de web.config afin de tester le répertoire de sortie des projets. Pour ce faire, cliquez avec le bouton droit de la souris sur Test de l'application et sélectionnez Propriétés. Vous devriez maintenant voir les propriétés du projet. Cliquez sur "Build Events", puis sur le bouton "Edit Post-build ...". Écrivez la ligne suivante à cet endroit:

copy "$(SolutionDir)\WebApplication1\web.config" "$(ProjectDir)$(OutDir)$(TargetFileName).config"

Et cliquez sur OK. (Notez que vous devez probablement modifier WebApplication1 lorsque vous nommez le projet que vous souhaitez tester). Si vous avez un chemin incorrect vers web.config, la copie échoue et vous le remarquerez lors de la génération infructueuse.

Edit:

Pour copier du projet actuel vers le projet test:

copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"
20
Antti

C'est un peu vieux mais j'ai trouvé une meilleure solution pour cela. J'essayais la réponse choisie ici, mais on dirait que .testrunconfig est déjà obsolète.

1. Pour les tests unitaires, la configuration est une interface (IConfig)

pour les tests unitaires, la configuration ne devrait vraiment pas faire partie de vos tests, alors créez une maquette que vous pouvez injecter. Dans cet exemple, j'utilisais Moq.

Mock<IConfig> _configMock;
_configMock.Setup(config => config.ConfigKey).Returns("ConfigValue");
var SUT = new SUT(_configMock.Object);

2. Pour le test d'intégration, ajoutez dynamiquement la configuration dont vous avez besoin

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if(config.AppSettings.Settings[configName] != null)
{
    config.AppSettings.Settings.Remove(configName);
}
config.AppSettings.Settings.Add(configName, configValue);
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("appSettings");
7
MichaelChan

C'est très facile.

  • Faites un clic droit sur votre projet de test
  • Ajouter -> Article existant
  • Vous pouvez voir une petite flèche juste à côté du bouton Ajouter
  • Sélectionnez le fichier de configuration, cliquez sur "Ajouter comme lien"
5
Hari Das

Si vous utilisez NUnit, jetez un oeil à this post . Fondamentalement, vous devez avoir app.config dans le même répertoire que votre fichier .nunit.

4
Cory Foy

Si votre application utilise des paramètres tels que Asp.net ConnectionString, vous devez ajouter l'attribut HostType à votre méthode, sinon ils ne se chargeront pas, même si vous avez un fichier App.Config.

[TestMethod]
[HostType("ASP.NET")] // will load the ConnectionString from the App.Config file
public void Test() {

}
2
Zyo

J'utilise NUnit et dans mon répertoire de projet, j'ai une copie de mon App.Config qui modifie une configuration (exemple, je redirige vers une base de données de test ...). Vous devez l'avoir dans le même répertoire du projet testé et tout ira bien.

0
Patrick Desjardins

Aucune de ces suggestions ne fonctionnant avec nUnit 2.5.10, j’ai donc fini par utiliser la fonctionnalité Projet -> Éditer de nUnit pour spécifier le fichier de configuration à cibler (comme d’autres l'ont déjà dit, il doit être dans le même dossier que le. le fichier de la nonunit lui-même). Le côté positif de ceci est que je peux donner un nom à Test.config au fichier de configuration, ce qui rend beaucoup plus clair ce que c'est et pourquoi.

0
Jane