2014-05-07 6 views
15

Wir verwenden Xunit zum Testen. Wir führen unsere Tests über den integrierten Visual Studio 2013 Test Runner mit dem Xunit-Plugin aus.Wie verweisen Sie auf Testdateien von Xunit-Tests in Visual Studio?

Das Problem besteht darin, dass einige der Tests sich auf Dateien auf dem Dateisystem beziehen müssen. Es scheint, dass Xunit (oder der VS Test Runner-nicht sicher welche), die Assemblierungen, aber keine unterstützenden Dateien im Verzeichnis bin in ein anderes Verzeichnis kopiert, bevor die Tests ausgeführt werden, daher werden unsere Testdateien nicht gefunden. [Die MS Testing Framework gibt Attribute für Dateien Auflistung kopiert werden, aber xUnit nicht.]

Wie entweder deaktivieren dieses Kopierverhalten oder auch programmatisch die ursprüngliche bin/ Verzeichnisposition bestimmen die Dateien zu holen?

Es scheint, dass die meisten vorgeschlagenen Lösungen (einschließlich auf der Xunit-Bug-Tracker-Website) vorschlagen, die Dateien als eingebettete Ressourcen anstelle von "Immer kopieren" -Dateien zu speichern. Dies ist jedoch nicht immer praktisch, zum Beispiel: Testen von Dateimanipulationscode und (in einem Fall) Code, der eine SQLite-Datenbankdatei benötigt.

Antwort

24

Okay, typisch, nur sobald ich die Frage posten, finde ich die Antwort selbst ...

Der Kern ist, dass das Kopieren (Schattenkopie) von Baugruppen von .NET Framework zu tun scheint, nicht von Visual Studio oder von Xunit.

Wir hatten Assembly.Location verwendet, um die Assemblydatei und damit die Testdateien zu lokalisieren. Dies war jedoch falsch, da es den Ort der Schattenkopie statt der Originale gab.

Stattdessen sollten Sie Assembly.CodeBase verwenden, um den Speicherort der Basisbaugruppe abzurufen. Dies ist jedoch eine (Datei-) URL, daher ist es notwendig, den Pfad von der URL zu extrahieren. Die neue (C#) Code sieht wie folgt aus:

var codeBaseUrl = new Uri(Assembly.GetExecutingAssembly().CodeBase); 
var codeBasePath = Uri.UnescapeDataString(codeBaseUrl.AbsolutePath); 
var dirPath = Path.GetDirectoryName(codeBasePath); 
return Path.Combine(dirPath, relativePath); 

... wo relativePath ist der Pfad relativ zum Bin\ Verzeichnis.

+0

Leider ist diese Lösung nicht mehr funktionieren, URL Einstiegspunkt ist irrelevant: System.IO.FileNotFoundException: Finden Sie kann nicht Datei 'C: \ Benutzer \ [Benutzername] \. Nuget \ packages \ microsoft.testplatform.testhost \ 15.0.0 \ lib \ sample.log'. – st78

+0

@ st78 Was meinst du "funktioniert nicht mehr" - Welche Version von .NET verwenden Sie? Was meinst du mit "Einstiegspunkt-URL"? – andrewf

+1

Ich hatte das gleiche Problem wie st78 bei der Verwendung von Xunit und .net Core, aber das hat es gelöst. Ich habe Assembly.Location verwendet, aber ich hatte den Fehler, den st78 erwähnt. Mit CodeBase wurde das Problem behoben. – alas

2

Ich verwende .Net Core 1.0 auf Mac. Assembly.GetExecutingAssembly ist nicht verfügbar. Ich verwende den folgenden Code statt:

var location = typeof(YourClassName).GetTypeInfo().Assembly.Location; 
var dirPath = Path.GetDirectoryName(location); 
return Path.Combine(dirPath, relativePath); 

relativePath der Pfad relativ zum Verzeichnis der DLL ist.

4

Nach ein wenig Suche habe ich hier die Lösung gefunden: https://msdn.microsoft.com/en-us/library/ms182475.aspx.

Insbesondere ist der erste Schritt ist für mich genug gewesen:

Wenn sie zu einem Testprojekt spezifisch sind, umfassen sie als Content-Dateien in dem Visual Studio-Testprojekt. Wählen Sie sie im Projektmappen-Explorer aus, und legen Sie die Eigenschaft In Ausgabe kopieren auf Neu kopieren fest.

den folgenden Code ein:

var filename = "./Resources/fake.pdf" 
File.OpenRead(filename) 

The test project (note the Resource folder) Cfg of files in the resource folder

+0

Siehe auch: https://stackoverflow.com/questions/44374074/copy-files-to-output-directory-using-csproj-dotnetcore –