Les tests unitaires de l'application.fichier de configuration avec NUnit

quand vous testez à l'Unité une application qui s'appuie sur les valeurs d'une application.fichier de config? Comment tester que ces valeurs sont lues correctement et comment votre programme réagit à incorrecte valeurs saisies dans un fichier de config?

il serait ridicule d'avoir à modifier le fichier de configuration pour L'application NUnit, mais je ne peux pas lire dans les valeurs de l'application.config que je veux tester.

Edit: je pense que je devrais clarifier peut-être. Je ne suis pas inquiet A propos du ConfigurationManager qui ne lit pas les valeurs, mais je suis soucieux de tester comment mon programme réagit aux valeurs lues.

59
demandé sur Dana 2008-10-04 01:10:50

13 réponses

j'isole habituellement les dépendances externes comme lire un fichier de configuration dans leur propre classe de façade avec très peu de fonctionnalité. Dans les tests, je peux créer une version simulée de cette classe qui implémente et utilise cela au lieu du vrai fichier de configuration. Vous pouvez créer vos propres maquettes ou utiliser un cadre comme moq ou Rhino mocks pour cela.

de cette façon, vous pouvez facilement essayer votre code avec des valeurs de configuration différentes sans écrire des tests complexes qui écrivent d'abord xml-fichiers de configuration. Le code qui lit la configuration est généralement si simple qu'il nécessite très peu de tests.

43
répondu Mendelt 2008-10-03 21:16:03

Vous pouvez modifier votre section de configuration à l'exécution dans votre configuration de test. Par exemple:

// setup
System.Configuration.Configuration config = 
     ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.Sections.Add("sectionname", new ConfigSectionType());
ConfigSectionType section = (ConfigSectionType)config.GetSection("sectionname");
section.SomeProperty = "value_you_want_to_test_with";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("sectionname");

// carry out test ...

vous pouvez bien sûr configurer vos propres méthodes d'aide pour le faire plus élégamment.

30
répondu SteveC 2012-12-19 12:09:15

vous pouvez appeler la méthode set de ConfigurationManager.AppSettings pour définir les valeurs de test de l'unité.

[SetUp]
public void SetUp()
{
  ConfigurationManager.AppSettings.Set("SettingKey" , "SettingValue");
  // rest of unit test code follows
}

lorsque l'essai unitaire est effectué, il utilise alors ces valeurs pour exécuter le code

20
répondu Pervez Choudhury 2013-07-08 10:35:15

vous pouvez à la fois lire et écrire dans le fichier app.config avec la ConfigurationManager classe

16
répondu Steven A. Lowe 2012-12-19 12:10:02

je faisais face à des problèmes similaires avec le web.config.... Je trouve une solution intéressante. Vous pouvez encapsuler la fonction de lecture de configuration, par exemple quelque chose comme ceci:

public class MyClass {

public static Func<string, string> 
     GetConfigValue = s => ConfigurationManager.AppSettings[s];

//...

}

et ensuite normalement utiliser

string connectionString = MyClass.GetConfigValue("myConfigValue");

mais dans le test unitaire initialiser "override" la fonction comme ceci:

MyClass.GetConfigValue = s =>  s == "myConfigValue" ? "Hi", "string.Empty";

pour en savoir plus:

http://rogeralsing.com/2009/05/07/the-simplest-form-of-configurable-dependency-injection /

11
répondu Tuomas Hietanen 2012-12-19 12:11:05

une solution plus élégante consiste à utiliser une simple injection ancienne de dépendance sur les paramètres de configuration eux-mêmes. IMHO ceci est plus propre que d'avoir à simuler une classe de lecture de configuration / wrapper etc.

par exemple, disons qu'une classe" Météo "nécessite un" ServiceUrl " pour fonctionner (par exemple, disons qu'il appelle un service web pour obtenir la météo). Plutôt que d'avoir une ligne de code qui va activement à un fichier de configuration pour obtenir ce paramètre (si ce code dans les Weather class ou un lecteur de configuration séparé qui pourrait être moqué selon certaines des autres réponses), la classe Weather peut permettre d'injecter le réglage, soit via un paramètre au constructeur, ou éventuellement via un setter de propriété. De cette façon, les tests unitaires sont extrêmement simples et directs, et ne nécessitent même pas de moqueries.

la valeur du réglage peut alors être injecté en utilisant une Inversion du contrôle (ou L'Injection de dépendance) récipient, de sorte que les consommateurs de la Weather class n'a pas besoin de fournir explicitement la valeur de quelque part, car il est manipulé par le conteneur.

3
répondu 2009-09-22 22:29:57

qui a fonctionné pour moi:

 public static void BasicSetup()
  {
     ConnectionStringSettings connectionStringSettings = 
          new ConnectionStringSettings();
     connectionStringSettings.Name = "testmasterconnection";
     connectionStringSettings.ConnectionString = 
          "server=localhost;user=some;database=some;port=3306;";
     ConfigurationManager.ConnectionStrings.Clear();
     ConfigurationManager.ConnectionStrings.Add(connectionStringSettings);
  }
2
répondu yonexbat 2012-12-19 12:12:13

vous pouvez toujours envelopper le bit de lecture-in dans une interface, et avoir une implémentation spécifique lue à partir du fichier de configuration. Vous écririez alors des tests en utilisant des objets Mock pour voir comment le programme manipulait les mauvaises valeurs. Personnellement, je ne testerais pas cette implémentation spécifique, car il s'agit du code Framework.net (et je suppose - avec un peu de chance - que le MS l'a déjà testé).

1
répondu Yuval 2008-10-03 21:13:48
Système

.Configuration.L'Abstraction est une chose de beauté quand il s'agit de tester ce genre de choses.

voici le site du projet GitHub avec quelques bons exemples: entrez la description du lien ici

voici le site NuGet: https://www.nuget.org/packages/System.Configuration.Abstractions /

Je l'utilise dans presque tous mes projets .NET.

1
répondu jakejgordon 2015-05-11 13:19:30

en fait, en y réfléchissant davantage, je suppose que ce que je devrais faire c'est créer une classe ConfigFileReader pour l'utiliser dans mon projet et ensuite la simuler dans le harnais d'essai de l'unité?

est-ce la chose habituelle à faire?

0
répondu Dana 2008-10-03 21:12:02

l'option la plus simple est d'envelopper les méthodes qui lisent la configuration de telle sorte que vous puissiez substituer des valeurs pendant les tests. Créer une interface que vous utilisez pour lire la configuration et avoir une implémentation de cette interface passer en paramètre de constructeur ou défini sur l'objet comme une propriété (comme vous le feriez en utilisant l'injection de dépendances/inversion de contrôle). Dans l'environnement de production, passer une application qui lit vraiment de la configuration dans l'environnement de test, pass dans une implémentation de test qui renvoie une valeur connue.

si vous n'avez pas la possibilité de modifier le code pour tester la testabilité, mais que vous avez encore besoin de le tester, Typemock Isolator fournit la possibilité de réellement simuler les classes de configuration .net framework de sorte que vous pouvez simplement dire" la prochaine fois que je demande telle ou telle valeur d'appSettings, retournez cette valeur connue."

0
répondu Travis Illig 2008-10-03 21:43:51

j'ai eu le même problème,

vous pouvez utiliser Nunit-console.exe c:\path1\testdll1.dll c:\path2\testdll2.dll

cela fonctionne très bien même si les deux dlls pointent vers une application différente.les configs ex testdll1.DLL.config et testdll2.DLL.config

si vous voulez utiliser Nunit project config et envelopper ces deux dlls, alors il n'y a aucun moyen d'avoir deux configs

vous devez avoir project1.config si votre Nunit projet de projet1.nunit au même endroit que le Projet1.nunit est assis.

espérons que cette aide

0
répondu sundar venugopal 2008-10-30 07:36:26

J'ai eu le même problème... Je voulais tester un projet BL référencé à partir d'un site web . mais je voulais tester le BL seulement. Ainsi, dans le pré-événement de construction du projet de test, je copie l'application.Config les fichiers dans le dossier bin\debug et les référencer à partir de l'application.config ...

0
répondu user798990 2015-04-13 08:20:42