Frage

Wenn eine Assembly eine app.config-Datei enthält, ConfigurationManager wird es geladen werden, solange sie im gleichen Verzeichnis wie das NUnit Projekt, das durch NUnit-Gui ausgeführt wird. Veranschaulicht die folgende Ordnerstruktur zu berücksichtigen.

+ TestFolder
    testProject.nunit
  + AssemblyAFolder
      assemblyA.dll
      assemblyA.dll.config
  + AssemblyBFolder
      assemblyB.dll
      assemblyB.dll.config

Sowohl AssemblyA und AssemblyB Übung Code, der in ConfigurationManager aufruft. Wenn ich diese Testanordnungen unabhängig in NUnit-Gui laufen, ConfigurationManager werden die lokalen Konfigurationsdateien korrekt lösen.

Wenn ich jedoch testProject.nunit in NUnit-Gui laden (die Verweise auf beide AssemblyA und AssemblyB enthält), sieht ConfigurationManager für die Konfigurationsdatei in TestFolder unabhängig von der Baugruppe wird zur Zeit ausgeführt wird.

Gibt es eine Möglichkeit NUnit zu richten die Anwendungskonfiguration auf den einem in der aktuellen Assembly-Verzeichnis neu zu laden?

Hier ist der Inhalt von testProject.nunit:

<NUnitProject>
  <Settings activeconfig="Debug" />
  <Config name="Debug" binpathtype="Auto">
    <assembly path="AssemblyAFolder\assemblyA.dll" />
    <assembly path="AssemblyBFolder\assemblyB.dll" />
  </Config>
</NUnitProject>
War es hilfreich?

Lösung

Der NUnit Blog erklärt, warum die Config-Dateien laden wie sie es tun. Im Grunde, was sie sagten, war, dass NUnit lässt den Rahmen der Konfigurationsdateien verarbeiten und nicht jeder der Verwaltung tun.

Sie können auch die testProject.config Datei verwenden, die in Ihrem Fall geladen werden würden, die Konfigurationsdateien für jede der Baugruppen zu verweisen. Mit Hilfe der appSettings Dateiattribut Schlüssel hinzuzufügen.

Eine letzte Alternative ist, die configSource Element Attribut den Abschnitt zu verwenden, in einer der Baugruppen-Konfigurationsdateien.

Hope, das hilft.

Andere Tipps

Nunit ist nicht in der Lage, den Weg der App.config Datei in unserem Projekt zu lokalisieren. Also müssen wir manuell die Nunit sagen, wo die App.config Datei in unserem Projekt platziert ist (offensichtlich auf dem Stammordner).

In meinem Fall die Projektstruktur ist wie folgt

     +ProjectWEBApp//web pages
       +Modules
         +aspx pages
       +web.Config

    +projectBusinesslogic //business logic .cs files
       +Modules
         +.cs

      +ProjectTestName// a seperate Nunit test cases project
        +Modules
      +App.Config

die ProjectWebApp verwendet die Referenzen von projectBusinesslogic, die die Geschäftslogik enthält. die + ProjectTestName verwendet die Referenz von projectBusinesslogic Test auf die Geschäftslogik auszuführen. Die Probleme beginnen hier, Nunit Testprojekt benötigt eine eigene Datei app.config. es wird nicht Datei web.config wie bei projectBusinesslogic verwenden, also wenn Sie Nunit laufen wird ein Fehler prompt

  

-Null-Referenz Ausnahme ....... Objekt Moment nicht auf ...........

Solution- Wenn Sie die Nunit GUI ausführen

  1. Project-> Bearbeiten ein neues Pop-up öffnet
  2. Eigenschaften -> Allgemein-> Konfigurationsdatei Name-> fügen Sie Ihre app.config Dateiname
  3. File-> Speichern und schließen Sie das Pop-up-Fenster
  4. ON Nunit Gui-File-> Reload Projekt

und das ist die einfache Lösung für Ihr Problem

Das configSource Element Lösung von MarkLawrence gegeben ist, was ich gesucht habe, und funktioniert gut. Die Herausforderung, diese Lösung bei der Umsetzung jedoch ist die Montage Konfiguration Last zu machen, wenn Tests sowohl von einem expliziten NUnit-Projekt (wie in meinen Fall ), und wenn für eine Baugruppe in Isolation der Unit-Tests laufen (kein explizites Projekt ). Um dies zu erreichen, wurden die folgenden Änderungen an meinem File-Layout erforderlich.

+ TestFolder
    testProject.nunit
    testProject.config
  + AssemblyAFolder
      assemblyA.dll
      assemblyA.dll.config
      assemblyA.dll.configfragment
  + AssemblyBFolder
      assemblyB.dll
      assemblyB.dll.config
      assemblyB.dll.configfragment

Die configfragment Dateien erstellt die Assembly-Konfiguration enthalten, die einmal in den entsprechenden config Dateien war. Anschließend werden die Dateien config nur ein configSource Element mit einem relativen Pfad zu der entsprechenden configfragment Datei enthalten modifizieren. Beachten Sie, dass das einzige Mal, dass dieser Ansatz nicht funktioniert ist, wenn assemblyA.dll und assemblyB.dll beide den gleichen Konfigurationsabschnitt erfordern, wie ein Konflikt entstehen, wenn testproject.config zu schaffen.

Nach diesem Ansatz experimentiert entschied ich mich für die Erzeugung der Baugruppenkonfiguration zur Laufzeit zu verlassen, und entfernen Sie die statischen Konfigurationsdateien alle zusammen. Hier ist ein Code, der zeigt, wie die Konfiguration zu erzeugen, und macht es zugänglich, unabhängig davon, wie der Montage-under-Test geladen wird.

void WithConfigurationFile(Action method)
{
    // Create the assembly configuration.
    string settingsSection = "myConfigSectionName";
    Configuration config =
        ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    config.Sections.Add(
        settingsSection,
        new ConfigSectionType(/*config element values*/);
    config.Save();

    try
    {
        // Invoke the method with the new configuration.
        ConfigurationManager.RefreshSection(settingsSection);
        method();
    }
    finally
    {
        // Revert the assembly configuration.
        File.Delete(config.FilePath);
        ConfigurationManager.RefreshSection(settingsSection);
    }
}

Durch die Verwendung des ConfigurationManager.OpenExeConfiguration () Überlastung, das tut keinen Pfad akzeptieren, laden wir die Konfiguration von Arbeitsverzeichnis des Host-Anwendung, die Tests, wie Sie führen Sie Ihre NUnit ändert. Auch die try / finally Garantien blockieren, dass die Assembly-Konfiguration nicht mit anderen Tests stören, die oder nicht solche Konfiguration erfordern.

Schließlich innerhalb eines Unit-Tests zu verwenden:

[Test]
void VerifyFunctionality
{
    WithConfigurationFile(delegate
    {
        // implement unit test and assertions here
    });
}

Ich hoffe, das hilft anderen, die ähnliche Probleme gestoßen haben können!

Mit dem configfile Attribute in der Config-Ebene in Ihrer .nunit-Datei:


<Config name="Debug" configfile="myconfigfilenamegoeshere.config />

Eigentlich, wenn Sie NUnit und einen Läufer innerhalb von Visual Studio verwenden, können Sie Ihren Wert in einem App.config in Ihrem Testprojekt bleiben. Dann fügen Sie diese Zeile in der Post-Build-Ereignisse:

Kopieren / Y „$ (ProjectDir) App.config“ „$ (TargetDir) $ (TargetFileName) .config“

Wenn Sie den Konfigurationsmanager in Ihren Tests zugreifen, NUnit werden die Werte in Ihrem app.config .Net im initialize-Methode übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top