Wie weisen Sie NUnit eine Assembly dll.config Datei aus einem bestimmten Verzeichnis zu laden?
-
05-07-2019 - |
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>
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
- Project-> Bearbeiten ein neues Pop-up öffnet
- Eigenschaften -> Allgemein-> Konfigurationsdatei Name-> fügen Sie Ihre app.config Dateiname
- File-> Speichern und schließen Sie das Pop-up-Fenster
- 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.