Resharper esegue UnitTest da una posizione diversa

Quando eseguo i test unitari con Visual Studio, funziona correttamente, poiché viene eseguito dalla directory del progetto in cui si trovano tutti gli assembly. Ma quando lo eseguo con il programma di ricerca , viene visualizzato con errore

var services = Assembly.Load("SomeAssembly"); 

con errore

Imansible caricare il file o l’assembly “SomeAssembly” o una delle sue dipendenze. Il sistema non trova il file specificato..

Quindi ho provato

 var path = Assembly.GetExecutingAssembly().Location; 

e non è un progetto. Suo

C: \ Users \ * Username * \ AppData \ Local \ Temp \ TestResults \ … \ Out \

e non c’è “SomeAssembly” . Come configurare correttamente il richiama di risorsa o raccogliere tutti gli assembly come fa Visual Studio?

Succede con i test unitari ma non con NUnit, qualche idea?

L’ombra resharper copia gli assembly per il test di default. Se disattivi la copia shadow, questa verrà eseguita nella cartella bin e il test dovrebbe passare. Ecco alcune istruzioni per spegnerlo.

Nella documentazione di NUnit’s Gui Test Runner le impostazioni riportano la seguente nota su Shadow Copy

Nota: se si è tentati di disabilitare la copia shadow per accedere ai file nella stessa directory dell’assembly, è necessario tenere presente che esistono alternative. Prendi in considerazione l’utilizzo della proprietà Assembly.Codebase anziché Assembly.Location.

Ecco un esempio di utilizzo della proprietà Assembly.Codebase

  private string AssemblyLocation() { var assembly = Assembly.GetExecutingAssembly(); var codebase = new Uri(assembly.CodeBase); var path = codebase.LocalPath; return path; } 

Ho avuto lo stesso problema, il runner di test di ricerca era in C: \ mentre le DLL e la soluzione effettive erano su un’altra unità. La soluzione era deselezionare “Use Legacy Runner” nella pagina delle impostazioni di MSTest nelle opzioni del programma di ricerca.

Prova a creare un file di test e configurare le regole di distribuzione per i test .

Le versioni precedenti del resharper sembrano avere alcuni bug durante l’elaborazione della distribuzione di cartelle , penso che sia stato risolto nell’ultima versione di resharper 7 .

Prova questo codice per il caricamento (vedi sotto). Ricerca assiemi indipendenti dal test runner.

 private static string[] assemblyLookupPath = new[] { AppDomain.CurrentDomain.BaseDirectory, Environment.CurrentDirectory, Assembly.GetExecutingAssembly().Location }.Distinct().ToArray(); public static void Assembly Load(string fileName) { var filePath = assemblyLookupPath .Select(f=>Path.Combine(f, fileName)) .Where(File.Exists) .FirstOrDefault(); /*do here null checks and raise errors, write logs, etc*/ return Assembly.LoadFrom(filePath ) } 

Stai caricando i tuoi assiemi dynamicmente usando Assembly.Load() . Potrebbe essere che manchi un riferimento all’assembly da caricare. Altrimenti, la copia shadow potrebbe perdere gli assembly non referenziati.

Se non si desidera fare riferimento a questi assembly, assicurarsi di includerli nel progetto e copiarli nella directory di output. È ansible farlo impostando la proprietà ” Copia nella directory di output ” o creando un passaggio post-generazione personalizzato.

Solo per completare la risposta molto utile di mcdon , utilizzando assembly.Location fornisce la risposta corretta come da spiegazione di MSFT :

Il CodeBase è un URL del luogo in cui è stato trovato il file, mentre il percorso è il percorso da cui è stato effettivamente caricato. Ad esempio, se l’assembly è stato scaricato da Internet, il suo CodeBase potrebbe iniziare con “http: //”, ma la sua posizione potrebbe iniziare con “C: \”. Se il file è stato copiato in ombra, la posizione sarebbe il percorso verso la copia del file nella directory di copia shadow.

È inoltre utile sapere che non è garantito che CodeBase sia impostato per gli assembly nel GAC. La posizione sarà sempre impostata per gli assembly caricati da disco, tuttavia.

Pertanto vorrei usare il seguente:

 public static DirectoryInfo GetAssemblyDirectory() { var assembly = Assembly.GetExecutingAssembly(); return new DirectoryInfo(Path.GetDirectoryName(assembly.Location)); } 

Basta cambiare la directory corrente

 var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location); Environment.CurrentDirectory = dir; // or Directory.SetCurrentDirectory(dir); 

https://github.com/nunit/nunit/issues/1072

Quello che mi ha risolto è stato impostare la proprietà “Copia locale” su true nel riferimento nunit.framework.dll nel progetto di test.

Se hai eseguito e generato problemi dopo aver distriggersto “shadow build”, devi prima scegliere “Pulisci tutto” dall’opzione Costruisci e successivamente creare il tuo progetto su “shadow build” disabilita