Un progetto di unit test può caricare il file app.config dell'applicazione di destinazione?


151

Sto testando un'applicazione .NET (.exe) che utilizza un file app.config per caricare le proprietà di configurazione. L'applicazione stessa dell'unità di test non ha un file app.config.

Quando provo a testare un'unità un metodo che utilizza una qualsiasi delle proprietà di configurazione, restituiscono null . Suppongo che ciò avvenga perché l'applicazione di unit test non verrà caricata nel file app.config dell'applicazione di destinazione.

Esiste un modo per sovrascriverlo o devo scrivere uno script per copiare il contenuto dell'app.config di destinazione in un'app.config locale?

Questo post fa questa domanda, ma l'autore la sta davvero guardando da una prospettiva diversa da me.

EDIT: dovrei menzionare che sto usando VS08 Team System per i miei test unitari.

Risposte:


59

Il modo più semplice per farlo è quello di aggiungere il .configfile nella sezione di distribuzione del test unitario.

Per fare ciò, apri il .testrunconfigfile dagli elementi della soluzione. Nella sezione Deployment, aggiungi i .configfile di output dalla directory di build del tuo progetto (presumibilmente bin\Debug).

Tutto ciò che è elencato nella sezione di distribuzione verrà copiato nella cartella di lavoro del progetto di test prima che i test vengano eseguiti, quindi il codice dipendente dalla configurazione funzionerà correttamente.

Modifica: ho dimenticato di aggiungere, questo non funzionerà in tutte le situazioni, quindi potrebbe essere necessario includere uno script di avvio che rinomina l'output .configin modo che corrisponda al nome del test unitario.


9
È molto più semplice aggiungere un campo app.config al progetto di test, quindi non è necessario giocare con .testrunconfig.
Rowland Shaw,

13
@Rowland se lo fai, devi conservare due copie di app.config. Preferirei passare 10 secondi, una volta, usando lo strumento .testrunconfig piuttosto che dover ricordare di aggiornare l'app.config in entrambi i posti.
Jeromy Irvine,

66
Non puoi semplicemente aggiungere un riferimento non copiante? (Aggiungi elemento esistente ...)
EFraim

6
Il commento di EFraim dovrebbe essere la risposta accettata, è molto più semplice di ogni altra cosa.
reggaeguitar,

28
Per la soluzione di EFraim: assicurati di utilizzare "Aggiungi come collegamento" dal pulsante di comando. Altrimenti avrai ancora una copia. Inoltre, sebbene la domanda sia specifica per un'app .Net, questa non funzionerà per un'app Web poiché la configurazione di un'app Web ha il nome errato (Web.Config, non App.Config)
Rob Von Nesselrode,

104

In Visual Studio 2008 ho aggiunto il app.configfile al progetto di test come elemento esistente e ho selezionato copia come link per assicurarmi che non sia duplicato. In questo modo ho solo una copia nella mia soluzione. Con diversi progetti di test è davvero utile!

Aggiungi elemento esistente

Aggiungi come collegamento


7
Risposta perfetta, semplice e obiettiva! +1
Custodio

2
Questa è la soluzione migliore e dovrebbe essere contrassegnata come risposta.
Niaher

4
Per aggiungere l'elemento esistente "come collegamento" è necessario: "Nella finestra di dialogo Aggiungi elemento esistente, individuare e selezionare l'elemento del progetto che si desidera collegare", quindi: "Dall'elenco a discesa pulsante Apri, selezionare Aggiungi come collegamento. "
Ururiel

Questo ha funzionato alla grande per me. Sto cercando di pensare a una situazione in cui non funzionerebbe ... E ho pensato abbastanza ora. Grazie!
Dudeman3000,

53

Indipendentemente dal fatto che tu stia utilizzando Team System Test o NUnit , è consigliabile creare una libreria di classi separata per i test. La semplice aggiunta di un App.config al progetto Test verrà automaticamente copiata nella cartella bin durante la compilazione .

Se il tuo codice dipende da specifici test di configurazione, il primo test che scrivo conferma che il file di configurazione è disponibile (in modo da sapere che non sono pazzo ):

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

E il test:

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

Idealmente, dovresti scrivere codice in modo tale che i tuoi oggetti di configurazione vengano passati alle tue classi. Questo non solo ti separa dal problema del file di configurazione, ma ti consente anche di scrivere test per diversi scenari di configurazione.

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());
     }
}

2
Concordo con lo spirito di passare la dipendenza dalla configurazione qui, a quanto sembra aver risposto, Mark Seemann non meno! qui: Test unitari non riusciti a causa della mancanza del file .config
Shaun

C'è un "mancante nella riga: stringa valore = ConfigurationManager.AppSettings [" TestValue]; Ho provato a risolverlo, ma avrei dovuto trovare altri 5 caratteri da correggere per ottenere StackOverflow per consentirmi di effettuare una modifica.
Jane,

22

Se si dispone di una soluzione che contiene ad esempio l'applicazione Web e il progetto di test, probabilmente si desidera che il progetto di test utilizzi web.config dell'applicazione Web.

Un modo per risolverlo è copiare web.config per testare il progetto e rinominarlo come app.config.

Un'altra soluzione migliore è quella di modificare la catena di compilazione e renderlo una copia automatica di web.config per testare la directory di output dei progetti. Per fare ciò, fare clic con il tasto destro del mouse su Test Application e selezionare Proprietà. Ora dovresti vedere le proprietà del progetto. Fai clic su "Crea eventi", quindi fai clic sul pulsante "Modifica post-build ...". Scrivi la seguente riga lì:

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

E fai clic su OK. (Nota che molto probabilmente dovrai cambiare WebApplication1 come nome del progetto che vuoi testare). Se hai un percorso errato per web.config, la copia fallisce e lo noterai durante la compilazione non riuscita.

Modificare:

Per copiare dal progetto corrente al progetto di prova:

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

Soluzione davvero bella. Questo mi ha aiutato a evitare di copiare e duplicare .configfile. Grazie per la condivisione! :)
Leniel Maccaferri,

Ottima soluzione! Molte grazie.
Vin Shahrdar,

Bella soluzione, ma cosa succede quando i principali web.confighanno solo riferimenti a .configfile esterni all'interno dello stesso progetto. Poiché il percorso può puntare solo a cartelle all'interno della stessa directory (che è vera normalmente), quando si eseguono i test, non sarà in grado di gestire quei file esterni. Qualche idea su come risolverlo?
Sugafree,

Questo ha funzionato per me: copia "$ (SolutionDir) \ MainProject \ Web.config" "$ (ProjectDir) app.config"
Andrew

8

Questo è un po 'vecchio ma ho trovato una soluzione migliore per questo. Stavo provando la risposta scelta qui, ma sembra che .testrunconfig sia già obsoleto.

1. Per i test delle unità, avvolgere la configurazione è un'interfaccia (IConfig)

per i test unitari, la configurazione in realtà non dovrebbe far parte di ciò che i test hanno creato, quindi crea una simulazione che puoi iniettare. In questo esempio stavo usando Moq.

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

2. Per il test di integrazione, aggiungere dinamicamente la configurazione richiesta

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");

5

Questo è molto semplice

  • Fare clic con il tasto destro sul progetto di test
  • Aggiungi -> Articolo esistente
  • Puoi vedere una piccola freccia accanto al pulsante Aggiungi
  • Seleziona il file di configurazione fai clic su "Aggiungi come collegamento"

4

Se stai usando NUnit, dai un'occhiata a questo post . Fondamentalmente dovrai avere il tuo app.config nella stessa directory del tuo file .nunit.


Sto usando VS08 Team System per i miei test unitari, ma grazie per il suggerimento NUnit!
Jordan Parmer,

2

Se l'applicazione utilizza impostazioni come Asp.net ConnectionString, è necessario aggiungere l'attributo HostType al metodo, altrimenti non verranno caricati anche se si dispone di un file App.Config.

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

}

0

Uso NUnit e nella directory del mio progetto ho una copia del mio App.Config che cambio alcune configurazioni (esempio reindirizzo a un database di test ...). Devi averlo nella stessa directory del progetto testato e andrà tutto bene.


0

Non ho potuto ottenere nessuno di questi suggerimenti per funzionare con nUnit 2.5.10, quindi ho finito per usare il progetto nUnit -> Modifica funzionalità per specificare il file di configurazione di destinazione (come altri hanno detto che deve essere nella stessa cartella di. file nunit stesso). Il lato positivo di questo è che posso dare al file di configurazione un nome Test.config che rende molto più chiaro di cosa si tratta e perché è)


0

I test unitari sono considerati come un ambiente che esegue il codice per testarlo. Proprio come qualsiasi ambiente normale, hai cioè la messa in scena / produzione. Potrebbe essere necessario aggiungere un .configfile anche per il progetto di test. Una soluzione alternativa consiste nel creare una libreria di classi e convertirla in Project Test aggiungendo i pacchetti NuGet necessari come NUnit e NUnit Adapter. funziona perfettamente con Visual Studio Test Runner e Resharper e hai il tuo app.configfile nel tuo progetto di test. inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

E infine ho eseguito il debug del mio test e valore da App.config:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.