2014-05-07 12 views
15

Usiamo Xunit per i test. Stiamo eseguendo i nostri test tramite Visual Studio 2013 Test Runner, utilizzando il plugin Xunit.Come fare riferimento ai file di test dai test Xunit in Visual Studio?

Il problema è che alcuni test devono fare riferimento ai file sul filesystem. Sembra che Xunit (o VS Test Runner - non so quale), copi gli assemblaggi, ma non tutti i file di supporto nella directory bin, in un'altra directory prima di eseguire i test, quindi i nostri file di test non vengono trovati. [Il quadro MS Test specifica gli attributi per l'elenco dei file da copiare, ma non si xUnit.]

Come sia disabilitare questo comportamento la copia, oppure di programmazione determinare la posizione originale bin/ directory per recuperare i file?

Sembra che la maggior parte delle soluzioni proposte (incluso nel sito di tracciamento dei bug di Xunit) suggeriscono di archiviare i file come risorse incorporate invece di file 'copia sempre'. Tuttavia, questo non è sempre pratico, ad esempio: test del codice di manipolazione dei file e (in un caso) codice che vuole un file di database Sqlite.

risposta

24

Okay, tipico, non appena ho posto la domanda, trovo la risposta io stesso ...

Il succo è che la copia (Ombra copia) dei gruppi sembra essere fatto dal framework .NET, non da Visual Studio o da Xunit.

Abbiamo utilizzato Assembly.Location per individuare il file di assieme e quindi i file di test. Tuttavia, questo era sbagliato, dal momento che ci ha dato la posizione degli assemblaggi copiati dall'ombra invece degli originali.

Invece è necessario utilizzare Assembly.CodeBase per recuperare il percorso del codice dell'assieme di base. Tuttavia, questo è un URL (file), quindi è necessario estrarre il percorso dall'URL. Il nuovo (C#) codice simile a questo:

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

... dove relativePath è il percorso relativo alla directory Bin\.

+0

Sfortunatamente, questa soluzione non funziona più, Punto di ingresso url è irrilevante: System.IO.FileNotFoundException: Impossibile trovare il file 'C:. \ Users \ [nome utente] \ NuGet \ packages \ microsoft.testplatform.testhost \ 15.0.0 \ lib \ sample.log'. – st78

+0

@ st78 Che cosa intendi con "non funziona più"? Quale versione di .NET stai usando? Cosa intendi per "URL del punto di ingresso"? – andrewf

+1

Ho avuto lo stesso problema di st78 quando uso xunit e .net Core, ma questo lo risolse. Stavo usando Assembly.Location ma ho avuto l'errore menzionato da st78. L'uso di CodeBase ha risolto il problema. – alas

2

Sono in esecuzione .Net Core 1.0 su Mac. Assembly.GetExecutingAssembly non è disponibile. Io uso il seguente codice invece:

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

relativePath è il percorso relativo alla directory della DLL.

4

Dopo un po 'di ricerca ho trovato la soluzione qui: https://msdn.microsoft.com/en-us/library/ms182475.aspx.

In particolare, il primo passo è stato sufficiente per me:

Se sono specifici per singolo progetto di prova, comprendono le file come contenuto nel progetto di test di Visual Studio. Selezionali in Solution Explorer e imposta la proprietà Copy to Output su Copy if Newer.

associata al seguente codice:

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

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

+0

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

Problemi correlati