ConfigurationManager.AppSettings Renvoie La Valeur Null Dans Le Projet De Tests Unitaires
J'ai un C# projet de test d'unité avec les paramètres de l'application dans le app.config
fichier. Je suis en train de tester une classe qui existe dans un autre projet. Cette classe dépend à la fois, ConfigurationManager.AppSettings
et ConfigurationManager.ConnectionStrings
.
Le projet de la classe testée réside dans le fait de ne pas avoir une application.fichier de configuration. J'aurais pensé que parce que la classe est instanciée dans le cadre du projet de test d'unité qu'il utiliserait le projet de tests unitaires de l'application.fichier de configuration. En effet, il semble que ce soit le cas pour la chaîne de connexion.
La classe récupère la chaîne de connexion, sans aucun problème. Toutefois, lorsque la classe tente de récupérer tous les paramètres de l'application configuration manager renvoie toujours null
. Ce qui se passe ici?
Edit 1
Je pensais que ça serait une bonne idée d'essayer de charger certains paramètres dans le projet de test pour voir ce qui se passe. J'ai essayé de charger le réglage de l'unité de test juste avant d'appeler le code qui instancie la classe dans le projet externe. Même résultat, rien. Je suppose que je peux exclure l'autre projet à partir de l'équation pour l'instant.
Voici un extrait de mon fichier de config:
<configSections>
<sectionGroup name="applicationSettings"
type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="MyNamespace.Properties.Settings"
type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
requirePermission="false" />
</sectionGroup>
</configSections>
...
<applicationSettings>
<MyNamespace.Properties.Settings>
<setting name="Bing_Key"
serializeAs="String">
<value>...</value>
</setting>
</MyNamespace.Properties.Settings>
</applicationSettings>
et voici comment je m'y suis essayer de charger le paramètre:
string test = System.Configuration.ConfigurationManager.AppSettings["Bing_Key"];
Aucune de ces choses ont été fixés, comme vous l'avez décrit. Changer ne résout pas le problème.
Dans votre
app.config
, faire la config types de sections et les espaces de noms correspondent CM.AppSettings espace de noms?Avez-vous copiées à la section appSettings et le coller dans le projet de tests unitaires de l'application.config?
Avez-vous essayé d'ajouter le fichier de configuration pour votre projet en tant que lien dans votre projet de test? Le projet de test ont une référence à System.Configuration?
OriginalL'auteur Jason Boyd | 2014-06-19
Vous devez vous connecter pour publier un commentaire.
Vous avez mentionné les paramètres dans les propriétés du projet. Voir si vous pouvez accéder au réglage de cette façon:
Vous devrez peut-être obtenir l'exécution de l'assemblée de l'endroit où le fichier de paramètres de projet est défini, mais essayez dans un premier temps.
MODIFIER
Lors de l'utilisation de Visual Studio fichier de paramètres de projet, il ajoute des trucs à votre application.config et crée de l'application.la configuration, si elle n'est pas présente. ConfigurationManager ne PEUT PAS toucher à ces réglages! Vous ne pouvez obtenir pour ce type de projet.paramètres de fichier de l'aide de la méthode statique. Si vous souhaitez utiliser le ConfigurationManager, vous devez écrire à la main votre application.config. Ajoutez vos paramètres comme suit:
Corrigez-moi si je me trompe, mais il semble que vous avez besoin de projet externe pour être en mesure de s'accrocher dans les paramètres de votre projet, peu importe où ils vivent. Si c'est le cas, cela pourrait être utile pour accéder à ce fichier de paramètres à travers les différentes assemblées: stackoverflow.com/questions/2548476/...
Corrigez-moi si je me trompe (je ne suis probablement) mais je pensais que l'application.fichier de config était un peu comme un global/ambiant conteneur chargé dans le fil de ce que l'application principale était (le projet de tests unitaires dans ce cas). Ensuite, toutes les dll (le système sous test dans ce cas), lors de la lecture de toutes les propriétés de configuration, serait de lire les propriétés de cette même config conteneur.
les paramètres sont fonction du type et de l'espace de noms, de sorte qu'ils auraient pour correspondre à
C'est correct, mais autant que je me souvienne des paramètres de projet de travailler différemment d'un droit d'app.config. Aller dans cette voie, fossé votre projet fichier de settings (enregistrer votre stuff en premier) et d'ajouter une nouvelle application.la configuration de votre unité de test (ou principal exe) du projet. Vous pourrez ensuite ajouter vos paramètres de <appSettings> <add key="bing_api" value="quel que soit"/> </appSettings>.
OriginalL'auteur Bill Sambrone
Envisager la refactorisation de votre code qui accède à la configuration pour utiliser un wrapper. Ensuite, vous pouvez écrire se moque de la classe wrapper et ne pas avoir à traiter avec l'importation de fichier de configuration pour le test.
Dans une bibliothèque qui leur est commun, quelque chose comme ceci:
Ensuite, dans vos bibliothèques qui ont besoin d'accéder config, injecter une instance de ce type d'interface dans la classe qui a besoin de lire config.
Puis, dans l'une de vos bibliothèques, créer une mise en œuvre qui dépend de la config du fichier.
Ensuite, dans le code qui appelle votre classe.
Puis dans votre test, vous êtes libre de la dépendance de la servitude. 🙂 Vous pouvez soit créer une fausse version qui implémente IConfigurationWrapper et de le transmettre pour votre test, où vous coder en dur les valeurs de retour de la
GetValue
etHasKey
fonctions, ou si vous utilisez un moqueur de la bibliothèque comme Moq:Voici un article qui couvre le concept (quoique, pour les formulaires web, mais les concepts sont les mêmes): http://www.schwammysays.net/how-to-unit-test-code-that-uses-appsettings-from-web-config/
OriginalL'auteur xDaevax
Et puis il cria: "NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO".
Cite: j'ai un C# projet de test d'unité avec les paramètres de l'application dans l'app.fichier de configuration. Je suis en train de tester une classe qui existe dans un autre projet. Cette classe dépend à la fois, ConfigurationManager.AppSettings et ConfigurationManager.ConnectionStrings.
Vous ne le faites pas. JAMAIS!!!! Pourquoi? parce que vous avez maintenant créé une dépendance. Au lieu de cela, utiliser l'injection de dépendance si la classe ne peut faire son travail sans avoir à pic dans le fichier de configuration qui appartient à la demande.
OriginalL'auteur Gregory A Beamer