2010-12-02 9 views
25

Ich habe gerade begonnen, mit NUnit zu arbeiten, um eine Testabdeckung für meine Projekte bereitzustellen.Probleme mit NUnit beim Ermitteln des Verzeichnisses der Assembly

Innerhalb meiner Hauptbibliothek.dll Ich muss Konfigurationsdaten von einer externen Datei laden, die mit der Bibliothek, library.xml gehört.

Dies funktioniert gut, wenn ich die Bibliothek bin mit, weil ich das für die Config-Datei suchen verwende nach dem Verzeichnis, in dem erhalten:

string settingspath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 

Das Problem, das ich bemerkt habe ist, dass, wenn ich Wenn ich Unit-Tests mit NUnit durchführe, kopiert es meine Assemblies in eine Shadow Copy, nimmt aber keine der anderen Dateien mit, so dass meine Init aufgrund fehlender Konfigurationsdateien natürlich fehlschlägt.

Sollte ich etwas anderes tun, um Konfigurationsdateien aus meiner Bibliothek zu finden? (es ist eine Server-App, und ich möchte nicht die Standard-App-Einstellungen oder lokale Einstellungen des Benutzers verwenden, usw.)

+0

Ich nehme an, da es ein ist Bibliothek, sollte ich alle diese Art von Sachen externalised von Eigenschaften haben, aber das Problem ist, dass meine DLL erfordert, dass verschiedene (externe) Dateien an einem app-relativen Ort vorhanden sind. – Cylindric

Antwort

-10

Beim Komponententest wird generell empfohlen, externe Abhängigkeiten wie Dateisystem und Datenbanken zu vermeiden, indem die Routinen, die sie aufrufen, abgespottet werden - so sind Ihre Tests besser lokalisiert, weniger fragil und schneller. Sehen Sie, ob Sie die Abhängigkeiten entfernen können, indem Sie gefälschte Konfigurationsinformationen bereitstellen.

+0

Obwohl diese Antwort als richtig markiert ist, finde ich, dass Gishus Antwort am unteren Ende besser ist, weil es erlaubt, den kompilierten Standort der Assembly zu bestimmen, anstatt ihren Schattenkopierplatz. Das war die richtige Antwort für mich und stimmt mit der NUnit-Anleitung überein (http://www.nunit.org/index.php?p=optionsDialog&r=2.4). – Philippe

+1

Als Kommentar habe ich diese Bemerkung +1 gegeben, aber als Antwort ist sie für mich nicht hilfreich (Ich benutze NUnit, um einige Integrationstests durchzuführen, zum Besseren oder zum Schlechteren, und diese Antwort hilft mir * nicht * arbeiten). – Jeroen

19

Für die Verwendung von Referenzdateien in meinem Unit Tests, verwende ich Assembly.Codebase, die auch funktioniert, wenn Schattenkopie Ist eingeschaltet. Vielleicht möchten Sie es versuchen ..

Es gibt eine Zeichenfolge im Uri-Format .. so müssen Sie eine Uri-Instanz aus der Codebasis-Zeichenfolge erstellen und Uri.LocalPath verwenden, um den tatsächlichen Ordnerpfad abzurufen.

Für den Produktionscode sollte der BaseFolder jedoch von einem bekannten Ort abgerufen werden (z. B. einem Registrierungsschlüssel, der über das Installationsprogramm unter Windows festgelegt wurde). Alle Dateisuchen sollten von diesem Basisordner stammen.

+0

Das ist die richtige Antwort für mich. – Philippe

+0

Für alle anderen Leser lesen Sie die Antwort von Jeff Lewis unten. Neuere Versionen von Nunit machen das besser – Andy

1

Sie können das Schattenkopieren in der Befehlszeile mit dem Schalter /noshadow deaktivieren. Befehlszeilenoptionen sind dokumentiert here

Ist die externe Datei als Teil des Builds Ihrer DLL festgelegt? Wenn Sie es in das Projekt einbeziehen und es so einstellen, dass es immer in der Ausgabe kopieren in den Eigenschaften der Datei kopiert wird, dann sollte es in das Schattenverzeichnis gehen, denke ich.

Dies kann Ihnen helfen.

+0

Größtes Problem mit dem ich gefunden habe, ist, dass NUnit die Assembly sperrt, so dass ich es nicht neu kompilieren kann, ohne das NUnit-Projekt zu entladen. – Cylindric

12

Auch wenn das Schattenkopieren aktiv ist, zeigt AppDomain.CurrentDomain.BaseDirectory auf den ursprünglichen Speicherort der Test-DLLs.

Wenn Sie jedoch Ihre Testdaten als Ressourcen in Ihre DLL einbetten können, ist das viel sicherer, da keine zusätzlichen Dateien verloren gehen können.

+0

Ja, Probleme sind Konfigurationsdateien, die ich bearbeiten muss, und es ist die engine.dll, die ihre eigene Konfiguration lädt, also die zu testende Assembly, also woanders shadowcopied. Es riecht schlecht wie es ist, also werde ich den Konfigurationsparameter extern verschieben, so dass die resultierende DLL diesbezüglich keine "Smart" hat. – Cylindric

0

Wir fügen die Testressource in das Testprojekt ein (in diesem Fall in einen Ordner 'TestData').

in Visual Studio für die Ressource für den Zugriff in der Testmarke In Visual Studio for the resource to access in the test mark

Wenn Projekt baut verlässt das Bild auf dem 'bin \ Debug' -Ordner When project builds leaves the image on the 'bin\Debug' folder

und schreiben Sie den Pfad

string fullImagePath = @".\TestData\vcredist.bmp"; 
42

kann Gebrauch verwenden TestContext.CurrentContext.TestDirectoryas mentioned by Charlie Poole from NUnit here:

Die Notwendigkeit, auf Dateien im selben Verzeichnis wie die Testassembly zuzugreifen, ist der am häufigsten genannte Grund für das Deaktivieren der Schattenkopie. Jedoch ist dies falsch.

NUnit kopiert keine Baugruppen: Schattenkopie ist eine Funktion von .NET selbst. Folglich muss das Problem als "Wie kann ich auf die Datei zugreifen, wo es ist?" anstatt "Wie kann ich die Datei dorthin kopieren, wo ich denke, dass sie sein sollte?"

Es gibt drei Möglichkeiten, um eine Datei zu suchen, die in der gleichen Verzeichnis wie die Montage befindet:

1) Verwendung Assembly.Codebase - das Sie den Speicherort als URI geben, welche müssen Sie dann zu einem geeigneten Pfad transformieren.

2) Verwenden Sie das aktuelle Verzeichnis, das NUnit in der Vergangenheit auf Verzeichnis mit der ausführenden Testbaugruppe festgelegt hat. Dies gilt jedoch möglicherweise nicht für zukünftige Releases .

3) Verwenden Sie das TestContext.CurrentContext.TestDirectory von NUnit, welches in den neuesten Versionen ist.

Alle diese Ansätze verwenden Assembly.Codebase unter den Abdeckungen, mit NUnit die Arbeit der Transformation der URI richtig in # 2 und # 3. Der allgemeine Ansatz, Assembly.Location zu verwenden, ist falsch, es sei denn, Sie möchten den Speicherort des Schattenkopiespeichers .

+2

^^^^^ DIES IST DIE RICHTIGE ANTWORT ^^^^^. Nunit erledigt die Konvertierung von Assembly.Codebase in einen Pfad für Sie bereits. – Andy

+3

Dies funktioniert nicht, wenn Sie das aktuelle Verzeichnis zum Aufzählen von Testfällen verwenden möchten, da 'TestCaseSource' auf eine' statische' Eigenschaft/Feld/Methode verweisen muss jetzt. An dem Punkt, an dem es ausgewertet wird, ist 'TestContext.CurrentContext' nicht festgelegt. – filmor

+0

Sehr praktisch, hält den Test sauber –

0

Fand das gleiche Problem ... finden Sie mein Training:

Vor dem SUT Lauf aktualisieren AppDomain des Basisverzeichnis auf diese Weise ....

String root_path = "{{your path}}"; 
AppDomain.CurrentDomain.SetData("APPBASE", root_path); 
Verwandte Themen