it-swarm.com.de

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

Ich teste eine .NET-Anwendung (.exe), die eine app.config-Datei zum Laden von Konfigurationseigenschaften verwendet. Die Unit-Test-Anwendung selbst hat keine app.config-Datei.

Wenn ich versuche, eine Methode, die eine der Konfigurationseigenschaften verwendet, einem Komponententest zu unterziehen, 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?

This post 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.

143
Jordan Parmer

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

Öffnen Sie dazu die Datei .testrunconfig In Ihren Solution Items. Fügen Sie im Abschnitt Bereitstellung die Ausgabedateien .config Aus dem Build-Verzeichnis Ihres Projekts hinzu (vermutlich bin\Debug).

Alles, was im Bereitstellungsabschnitt aufgelistet ist, wird in den Arbeitsordner des Testprojekts kopiert, bevor die Tests ausgeführt werden, sodass Ihr konfigurationsabhängiger Code einwandfrei 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 .config Umbenennt, damit sie mit dem Namen des Komponententests übereinstimmt.

55
Jeromy Irvine

In Visual Studio 2008 habe ich das app.config Datei zum Testprojekt als vorhandenes Element und ausgewählte Kopie als Link, um sicherzustellen, dass es nicht dupliziert wird. Auf diese Weise habe ich nur eine Kopie in meiner Lösung. Bei mehreren Testprojekten ist es sehr praktisch!

Add Existing Item

Add As Link

92
Geoffroy Seive

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

Wenn Ihr Code von bestimmten Konfigurationstests abhängt, wird beim allerersten Test, den ich schreiben würde, bestätigt, dass die Konfigurationsdatei verfügbar ist (, sodass 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 mit 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());
     }
}
53
bryanbcook

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

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

Eine andere und bessere Lösung besteht darin, die Erstellungskette zu ändern und eine automatische Kopie der Datei web.config zu erstellen, um das Ausgabeverzeichnis für Projekte zu testen. Klicken Sie dazu mit der rechten Maustaste auf Test Application und wählen Sie Properties aus. Jetzt sollten Sie Projekteigenschaften sehen. Klicken Sie auf "Build Events" und dann auf "Edit Post-Build ...". Schreibe dazu folgende Zeile:

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

Und klicken Sie auf OK. (Beachten Sie, dass Sie WebApplication1 höchstwahrscheinlich ändern müssen, während Sie den Namen des Projekts angeben, das Sie testen möchten.) Wenn Sie einen falschen Pfad zu web.config haben, schlägt das Kopieren fehl und Sie werden es bemerken, wenn die Erstellung fehlschlägt.

Bearbeiten:

So kopieren Sie aus dem aktuellen Projekt in das Testprojekt:

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

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

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

für Unit-Tests sollte die Konfiguration eigentlich nicht Teil Ihrer Tests sein. Erstellen Sie also einen Schein, den Sie einschleusen 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 dynamisch die gewünschte Konfiguration 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");
7
MichaelChan

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".
5
Hari Das

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.

4
Cory Foy

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() {

}
2
Zyo

Ich verwende NUnit und habe in meinem Projektverzeichnis eine Kopie meiner App.Config, die ich in einigen Konfigurationen ändere (Beispiel, das ich auf eine Testdatenbank umleitung ...). Sie müssen es im selben Verzeichnis des getesteten Projekts haben und es wird Ihnen gut gehen.

0

Ich konnte keinen dieser Vorschläge für die Arbeit mit nUnit 2.5.10 erhalten und habe daher letztendlich die Funktion "Projekt -> Bearbeiten" von nUnit verwendet, um die Konfigurationsdatei anzugeben, die als Ziel verwendet werden soll (wie andere angegeben 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 deutlich macht, was es ist und warum es ist.

0
Jane