J'essaie de finir ce gestionnaire d'exceptions:
if (ConfigurationManager.ConnectionStrings["ConnectionString"]==null)
{
string pathOfActiveConfigFile = ...?
throw new ConfigurationErrorsException(
"You either forgot to set the connection string, or " +
"you're using a unit test framework that looks for "+
"the config file in strange places, update this file : "
+ pathOfActiveConfigFile);
}
Ce problème semble ne m'arriver que lorsque j'utilise nUnit.
Essaye ça
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
J'espère que ça aide
À proprement parler, il n’existe pas de fichier de configuration unique. Hors ASP.NET1 il peut y avoir trois fichiers de configuration utilisant le fichier incorporé (System.Configuration
) soutien. En plus de la configuration de la machine: app.exe.config
, utilisateur itinérant et utilisateur local.
Pour obtenir la configuration "globale" ( exe . Config):
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
.FilePath
Utilisez différentes valeurs ConfigurationUserLevel
pour les fichiers de configuration itinérants et non itinérants à l'utilisation.
1 Qui a un modèle complètement différent où le contenu d'un dossier enfant (système de fichiers virtuel ou IIS) web.config
peut (selon le réglage) ajouter ou remplacer le web.config
.
Si vous voulez dire que vous n'obtenez qu'un retour nul lorsque vous utilisez NUnit, vous devrez probablement copier la valeur ConnectionString de votre app.config de votre application dans app.config de votre bibliothèque de test.
Lorsqu'il est exécuté par le chargeur de test, l'assembly de test est chargé au moment de l'exécution et recherche dans son propre app.config (renommé en testAssembly.dll.config lors de la compilation) plutôt que dans le fichier de configuration de vos applications.
Pour obtenir l’emplacement de l’Assemblée que vous utilisez, essayez
System.Reflection.Assembly.GetExecutingAssembly().Location
Assurez-vous de cliquer sur les propriétés du fichier et de le définir sur "Copier à tout moment", sinon il ne sera pas dans le dossier Debug\avec vos dll joyeuses lil pour configurer où il doit être et ajouter plus de cloche
La première fois que j'ai réalisé que le projet de tests unitaires faisait référence à app.config dans ce projet plutôt qu'à app.config associé à mon projet de code de production (bien sûr, DOH), je venais d'ajouter une ligne dans l'événement Post Build du projet Prod. cela copiera le fichier app.config dans le dossier bin du projet test.
Problème résolu
Je n'ai pas remarqué d'effets secondaires étranges jusqu'à présent, mais je ne suis pas sûr que ce soit la bonne solution, mais au moins cela semble fonctionner.
Une autre option que j'ai vue manque ici:
const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);
En fonction de l'emplacement de votre fichier de configuration, System.Reflection.Assembly.GetExecutingAssembly().Location
peut faire ce dont vous avez besoin.
J'ai essayé l'une des réponses précédentes dans une application Web (en fait, un rôle Web Azure s'exécutant localement) et cela n'a pas tout à fait fonctionné. Cependant, cette approche similaire a fonctionné:
var map = new ExeConfigurationFileMap { ExeConfigFilename = "MyComponent.dll.config" };
var path = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).FilePath;
Le fichier de configuration s'est avéré être dans C:\Program Files\IIS Express\MyComponent.dll.config. Lieu intéressant pour cela.