Ottieni valori dalla sezione web.config in un file app.config?
-
03-07-2019 - |
Domanda
Sto provando a testare i valori unitari che finiranno per finire in un file web.config. Nel mio progetto di test, ho creato un file app.config con una sezione web.config per contenere le impostazioni. In una situazione normale, chiamerei System.Configuration.ConfigurationSettings.AppSettings, ma in questo caso non funziona. Ho visto questa domanda , che è molto simile, ma non spiega come estrarre NameValueCollection dal file di configurazione. Ecco un esempio del file di configurazione:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<membership defaultProvider="CustomMembershipProvider">
<providers>
<clear/>
<add
name="CustomMembershipProvider"
applicationName="SettlementInfo"
enablePasswordRetrieval="false"
enablePasswordReset="false"
requiresQuestionAndAnswer="true"
writeExceptionsToEventLog="true" />
</providers>
</membership>
</system.web>
</configuration>
Qualcuno l'ha già affrontato prima?
Soluzione
Immagino di essere confuso qui; sembra che tu stia provando a verificare che ASP.NET stia utilizzando in modo appropriato il tuo provider di appartenenze personalizzato. Corretta?
In tal caso, sono sicuro al 99,999% di non poter testare l'unità utilizzando il framework MS; è necessario testarlo per l'integrazione distribuendolo al server web (o eseguendo Cassini in VS) e digitando un nome utente / password nella pagina di accesso.
Ora, è possibile che ho frainteso la tua richiesta. In tal caso, fammi sapere e modificherò la mia risposta di conseguenza.
Modifica
Per ora, ci sto davvero provando per testare le coppie NameValue in uscita del file di configurazione, per assicurarsi che se i valori non sono presenti, mio vengono applicati i valori predefiniti. In altro parole, voglio provare a tirare applicationName e verificalo è uguale a "SettlementInfo" e così via. Successivamente, userò test di integrazione per garantire che ASP.NET sta utilizzando il framework personalizzato al posto di quello predefinito. Fa quello ha senso?
Ho bisogno di più di un commento per rispondere, quindi sto modificando. Se ti leggo correttamente, vuoi testare l'unità del tuo programma per assicurarti che gestisca correttamente la configurazione, sì? Significa che vuoi assicurarti che il tuo codice acquisisca, ad esempio, la chiave AppSettings corretta e gestisca un valore null in essa, corretto?
In tal caso, sei fortunato; non hai bisogno di app.config o web.config, puoi impostare i valori che ti servono come parte della configurazione del test.
Ad esempio:
[TestMethod]
public void Test_Configuration_Used_Correctly()
{
ConfigurationManager.AppSettings["MyConfigName"] = "MyConfigValue";
MyClass testObject = new MyClass();
testObject.ConfigurationHandler();
Assert.AreEqual(testObject.ConfigurationItemOrDefault, "MyConfigValue");
}
[TestMethod]
public void Test_Configuration_Defaults_Used_Correctly()
{
// you don't need to set AppSettings for a non-existent value...
// ConfigurationManager.AppSettings["MyConfigName"] = "MyConfigValue";
MyClass testObject = new MyClass();
testObject.ConfigurationHandler();
Assert.AreEqual(testObject.ConfigurationItemOrDefault, "MyConfigDefaultValue");
}
Altri suggerimenti
Ritengo che tu abbia accesso al file webconfig solo quando l'applicazione verrà avviata. La soluzione è piuttosto semplice - > & Quot; fasullo " la tua configurazione. Usa un NameValueCollection e usalo invece:
private static NameValueCollection CreateConfig()
{
NameValueCollection config = new NameValueCollection();
config.Add("applicationName", "TestApp");
config.Add("enablePasswordReset", "false");
config.Add("enablePasswordRetrieval", "true");
config.Add("maxInvalidPasswordAttempts", "5");
config.Add("minRequiredNonalphanumericCharacters", "2");
config.Add("minRequiredPasswordLength", "6");
config.Add("requiresQuestionAndAnswer", "true");
config.Add("requiresUniqueEmail", "true");
config.Add("passwordAttemptWindow", "10");
return config;
}
Ora puoi facilmente passare quella raccolta nella tua classe che ne analizza i dati.
Dovresti essere in grado di utilizzare il ConfigurationManager. Metodo GetSection () per estrarre quello che vuoi.
In realtà, se stai usando NUnit, puoi incollarlo in un App.config nel tuo progetto di test. Quindi aggiungi questa riga al tuo evento Post-build:
copia / Y & # 8220; $ (ProjectDir) Conf. app & # 8221; & # 8220; $ (TargetDir) $ (TargetFileName) .config & # 8221;
Quando crei il nuovo provider nei tuoi test, NUnit passerà i valori nella tua app.config al provider nel metodo di inizializzazione.
Perché non limitarlo nel file web.config?