Kann ein Unit-Test-Projekt die Datei app.config der Zielanwendung laden?

150

Ich teste eine .NET-Anwendung (.exe), die eine app.config-Datei zum Laden von Konfigurationseigenschaften verwendet. Die Unit-Test-Anwendung selbst verfügt nicht über eine app.config-Datei.

Wenn ich versuche, eine Methode zu testen, die eine der Konfigurationseigenschaften verwendet, geben sie null zurück . Ich gehe davon aus, dass dies daran liegt, dass die Unit-Test-Anwendung nicht in die app.config der Zielanwendung geladen wird.

Gibt es eine Möglichkeit, dies zu überschreiben, oder muss ich ein Skript schreiben, um den Inhalt der Ziel-app.config in eine lokale app.config zu kopieren?

Dieser Beitrag stellt diese Frage, aber der Autor betrachtet sie wirklich aus einem anderen Blickwinkel als ich.

EDIT: Ich sollte erwähnen, dass ich VS08 Team System für meine Unit-Tests verwende.

Jordan Parmer
quelle

Antworten:

59

Der einfachste Weg, dies zu tun, besteht darin, die .configDatei im Bereitstellungsabschnitt Ihres Komponententests hinzuzufügen .

Öffnen Sie dazu die .testrunconfigDatei in Ihren Lösungselementen. Fügen Sie im Abschnitt Bereitstellung die Ausgabedateien .configaus dem Build-Verzeichnis Ihres Projekts hinzu (vermutlichbin\Debug ).

Alle im Bereitstellungsabschnitt aufgeführten Elemente werden vor dem Ausführen der Tests in den Arbeitsordner des Testprojekts kopiert, sodass Ihr konfigurationsabhängiger Code ordnungsgemäß ausgeführt wird.

Bearbeiten: Ich habe vergessen hinzuzufügen, dies funktioniert nicht in allen Situationen. Daher müssen Sie möglicherweise ein Startskript einfügen, das die Ausgabe so umbenennt, dass .configsie mit dem Namen des Komponententests übereinstimmt.

Jeromy Irvine
quelle
9
Es ist viel einfacher, dem Testprojekt einfach ein Feld app.config hinzuzufügen - dann müssen Sie überhaupt nicht mit der .testrunconfig herumspielen.
Rowland Shaw
13
@Rowland Wenn Sie dies tun, müssen Sie zwei Kopien von app.config verwalten. Ich würde lieber einmal 10 Sekunden mit dem Tool .testrunconfig verbringen, als daran denken zu müssen, die app.config an beiden Stellen zu aktualisieren.
Jeromy Irvine
66
Können Sie nicht einfach eine nicht kopierende Referenz hinzufügen? (Vorhandenen Gegenstand
hinzufügen
6
EFraims Kommentar sollte die akzeptierte Antwort sein, dies ist viel einfacher als alles andere.
Reggaeguitar
28
Für die Lösung von EFraim: Verwenden Sie unbedingt "Als Link hinzufügen" über die Befehlsschaltfläche. Ansonsten erhalten Sie noch eine Kopie. Auch wenn die Frage speziell für eine .Net-App gilt, funktioniert dies für eine Web-App nicht, da die Konfiguration einer Web-App den falschen Namen hat (Web.Config, nicht App.Config)
Rob Von Nesselrode
103

In Visual Studio 2008 habe ich die app.configDatei als vorhandenes Element zum Testprojekt hinzugefügt und eine Kopie als Link ausgewählt, um sicherzustellen, dass sie nicht dupliziert wird. Auf diese Weise habe ich nur eine Kopie in meiner Lösung. Bei mehreren Testprojekten ist es sehr praktisch!

Vorhandenes Element hinzufügen

Als Link hinzufügen

bbodenmiller
quelle
7
Perfekte Antwort, einfach und objektiv! +1
Custodio
2
Dies ist die beste Lösung und sollte als Antwort markiert werden.
Niaher
4
Um ein vorhandenes Element "als Link" hinzuzufügen, sollten Sie: "Suchen Sie im Dialogfeld Vorhandenes Element hinzufügen das Projektelement, das Sie verknüpfen möchten, und wählen Sie es aus." Und dann: "Wählen Sie in der Dropdown-Liste Öffnen die Schaltfläche Als Link hinzufügen. ""
Uriel
Das hat bei mir super funktioniert. Ich versuche an eine Situation zu denken, in der es nicht funktionieren würde ... Und ich habe jetzt genug nachgedacht. Vielen Dank!
Dudeman3000
53

Unabhängig davon , ob Sie Team System Test oder NUnit verwenden , empfiehlt es sich, eine separate Klassenbibliothek für Ihre Tests zu erstellen. Durch einfaches Hinzufügen einer App.config zu Ihrem Testprojekt wird beim Kompilieren automatisch in Ihren bin-Ordner kopiert .

Wenn Ihr Code von bestimmten Konfigurationstests abhängt, bestätigt der allererste Test, den ich schreiben würde, dass die Konfigurationsdatei verfügbar ist ( damit ich weiß, dass ich nicht verrückt bin ):

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

Und der Test:

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

Idealerweise sollten Sie Code so schreiben, dass Ihre Konfigurationsobjekte an Ihre Klassen übergeben werden. Dies trennt Sie nicht nur vom Problem der Konfigurationsdatei, sondern ermöglicht Ihnen auch das Schreiben von Tests für verschiedene Konfigurationsszenarien.

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());
     }
}
bryanbcook
quelle
2
Ich stimme dem Geist zu, die Konfigurationsabhängigkeit hier weiterzugeben, dies scheint von Mark Seemann nicht weniger beantwortet worden zu sein! hier drüben
Shaun
In der Zeile fehlt ein ": string value = ConfigurationManager.AppSettings [" TestValue]; Ich habe versucht, das Problem zu beheben, hätte aber weitere 5 Zeichen finden müssen, um den Stapelüberlauf zu erhalten und eine Bearbeitung vornehmen zu können.
Jane
22

Wenn Sie eine Lösung haben, die beispielsweise Webanwendung und Testprojekt enthält, möchten Sie wahrscheinlich, dass Testprojekt die web.config der Webanwendung verwendet.

Eine Möglichkeit, dies zu lösen, besteht darin, web.config zu kopieren, um das Projekt zu testen, und es in app.config umzubenennen.

Eine andere und bessere Lösung besteht darin, die Build-Kette zu ändern und eine automatische Kopie von web.config zu erstellen, um das Ausgabeverzeichnis des Projekts zu testen. Klicken Sie dazu mit der rechten Maustaste auf Anwendung testen und wählen Sie Eigenschaften aus. Jetzt sollten Sie Projekteigenschaften sehen. Klicken Sie auf "Build Events" und dann auf "Edit Post-Build ...". Schreiben Sie dort folgende Zeile:

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

Und klicken Sie auf OK. (Beachten Sie, dass Sie WebApplication1 höchstwahrscheinlich als Projektnamen ändern müssen, den Sie testen möchten.) Wenn Sie einen falschen Pfad zu web.config haben, schlägt das Kopieren fehl und Sie werden es während eines erfolglosen Builds bemerken.

Bearbeiten:

So kopieren Sie vom aktuellen Projekt in das Testprojekt:

copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"
Antti
quelle
Wirklich schöne Lösung. Dies hat mir geholfen, das Kopieren und Duplizieren von .configDateien zu vermeiden . Danke für das Teilen! :)
Leniel Maccaferri
Sehr schöne Lösung! Vielen Dank.
Vin Shahrdar
Gute Lösung, aber was passiert, wenn die Hauptdateien web.confignur Verweise auf externe .configDateien innerhalb desselben Projekts haben? Da der Pfad nur auf Ordner im selben Verzeichnis verweisen kann (was normalerweise der Fall ist), kann er beim Ausführen von Tests diese externen Dateien nicht verarbeiten. Irgendeine Idee, wie man es löst?
Sugafree
Dies funktionierte für mich: Kopieren Sie "$ (SolutionDir) \ MainProject \ Web.config" "$ (ProjectDir) app.config"
Andrew
8

Das ist ein bisschen alt, aber ich habe eine bessere Lösung dafür gefunden. Ich habe hier die gewählte Antwort versucht, aber es sieht so aus, als ob .testrunconfig bereits veraltet ist.

1. Für Unit-Tests ist Wrap die Konfiguration eine Schnittstelle (IConfig)

Für Unit-Tests sollte config eigentlich nicht Teil Ihrer Tests sein. Erstellen Sie daher einen Mock, den Sie injizieren können. In diesem Beispiel habe ich Moq verwendet.

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

2. Fügen Sie für den Integrationstest die benötigte Konfiguration dynamisch hinzu

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");
MichaelChan
quelle
5

Das ist sehr einfach.

  • Klicken Sie mit der rechten Maustaste auf Ihr Testprojekt
  • Hinzufügen -> Vorhandenes Element
  • Sie können einen kleinen Pfeil direkt neben der Schaltfläche Hinzufügen sehen
  • Wählen Sie die Konfigurationsdatei aus und klicken Sie auf "Als Link hinzufügen".
Hari Das
quelle
4

Wenn Sie NUnit verwenden, schauen Sie sich diesen Beitrag an . Grundsätzlich muss sich Ihre app.config im selben Verzeichnis wie Ihre .nunit-Datei befinden.

Cory Foy
quelle
Ich verwende VS08 Team System für meine Unit-Tests, aber danke für den NUnit-Tipp!
Jordan Parmer
2

Wenn Ihre Anwendung Einstellungen wie Asp.net ConnectionString verwendet, müssen Sie Ihrer Methode das Attribut HostType hinzufügen. Andernfalls werden sie nicht geladen, selbst wenn Sie eine App.Config-Datei haben.

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

}
Zyo
quelle
0

Ich verwende NUnit und habe in meinem Projektverzeichnis eine Kopie meiner App.Config, mit der ich eine Konfiguration ändere (Beispiel, ich leite zu einer Testdatenbank um ...). Sie müssen es im selben Verzeichnis des getesteten Projekts haben, und es wird Ihnen gut gehen.

Patrick Desjardins
quelle
0

Ich konnte keinen dieser Vorschläge für die Arbeit mit nUnit 2.5.10 erhalten, daher habe ich die Funktion "Projekt -> Bearbeiten" von nUnit verwendet, um die zu konfigurierende Konfigurationsdatei anzugeben (wie andere gesagt haben, muss sie sich im selben Ordner wie die befinden. Nunit-Datei selbst). Die positive Seite davon ist, dass ich der Konfigurationsdatei einen Test.config-Namen geben kann, der viel klarer macht, was es ist und warum es ist.

Jane
quelle
0

Ihre Komponententests werden als eine Umgebung betrachtet, in der Ihr Code zum Testen ausgeführt wird. Wie in jeder normalen Umgebung haben Sie dh Inszenierung / Produktion. Möglicherweise müssen Sie auch eine .configDatei für Ihr Testprojekt hinzufügen . Eine Problemumgehung besteht darin, eine Klassenbibliothek zu erstellen und in Test Project zu konvertieren, indem Sie die erforderlichen NuGet-Pakete wie NUnit und NUnit Adapter hinzufügen. Es funktioniert einwandfrei mit Visual Studio Test Runner und Resharper und Sie haben Ihre app.configDatei in Ihrem Testprojekt. Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Und schließlich debuggte mein Test und Wert von App.config:

Geben Sie hier die Bildbeschreibung ein

Ben
quelle