it-swarm.com.de

Bei der Neuaufteilung wird UnitTest von einem anderen Ort aus ausgeführt

Wenn ich Komponententests mit Visual Studio ausführte, funktioniert es einwandfrei, da es vom Projektverzeichnis aus ausgeführt wird, in dem sich alle Assemblys befinden. Aber wenn ich es mit Resharper starte geht es mit Fehler weiter 

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

mit fehler

Datei oder Assembly 'SomeAssembly' oder einer ihrer .__-Dateien konnte nicht geladen werden. Abhängigkeiten. Die angegebene Datei wurde vom System nicht gefunden..

Also habe ich es versucht 

var path = Assembly.GetExecutingAssembly().Location;

und es ist kein Projekt. Es ist 

C:\Benutzer\* Benutzername *\AppData\Local\Temp\TestResults\...\Out \

und es gibt kein 'SomeAssembly' . Wie konfiguriere ich die Neuverteilung neu oder sammle alle Baugruppen wie in Visual Studio?

Es passiert bei Unit-Tests, aber nicht bei NUnit, irgendwelche Ideen?

47
Roar

Scharfschalten von Schattenkopien Assemblys zum Testen standardmäßig. Wenn Sie die Schattenkopie deaktivieren, wird sie im Ordner bin ausgeführt und der Test sollte bestanden werden. Hier sind einige Anweisungen zum Ausschalten.

42
tallseth

In der Dokumentation für NUnit's Gui Test Runner-Einstellungen finden Sie die folgenden Hinweise zu Shadow Copy

Note: Wenn Sie versucht sind, die Schattenkopie zu deaktivieren, um auf Dateien zuzugreifen, die sich im selben Verzeichnis wie Ihre Assembly befinden, sollten Sie sich bewusst sein, dass es Alternativen gibt. Erwägen Sie die Verwendung der Assembly.Codebase-Eigenschaft anstelle von Assembly.Location.

Hier ist ein Beispiel für die Verwendung der Assembly.Codebase-Eigenschaft

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

Ich hatte das gleiche Problem, der Testläufer war in C:\gespeichert, während sich die tatsächlich gebauten DLLs und die Lösung auf einem anderen Laufwerk befanden. Die Lösung bestand darin, das Kontrollkästchen "Legacy Runner verwenden" auf der Seite "MSTest-Einstellungen" in den Optionen zum erneuten Verschieben zu deaktivieren.

12
sinaptik

Versuchen Sie, eine Testeinstellungsdatei zu erstellen, und konfigurieren Sie Bereitstellungsregeln für Ihre Tests .

Ältere Versionen von Resharper scheinen einige Fehler beim Verarbeiten der Bereitstellung von Ordnern zu haben, ich denke, wurde in der neuesten Version von Resharper 7 behoben.

4
Alexander

Verwenden Sie diesen Code zum Laden (siehe unten). Es wird Baugruppen unabhängig vom Testläufer suchen.

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 )
}
3
Manushin Igor

Sie laden Ihre Baugruppen dynamisch, indem Sie Assembly.Load() verwenden. Möglicherweise fehlt Ihnen ein Verweis auf die zu ladende Assembly. Andernfalls können Schattenkopien die nicht referenzierten Assemblys verfehlen.

Wenn Sie diese Assemblys nicht referenzieren möchten, fügen Sie sie in Ihr Projekt ein und kopieren Sie sie in das Ausgabeverzeichnis. Sie können dies tun, indem Sie die Eigenschaft " Copy to Output Directory " festlegen oder einen benutzerdefinierten Postbuild-Schritt erstellen.

2
Dio F

Ändern Sie einfach das aktuelle Verzeichnis 

var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;

// or
Directory.SetCurrentDirectory(dir);

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

1
RouR

Um die sehr hilfreiche Antwort von mcdon zu vervollständigen, erhalten Sie mit Assembly.Location die richtige Antwort gemäß der Erklärung von MSFT :

Das CodeBase ist eine URL zu dem Ort, an dem die Datei gefunden wurde, während das Location ist der Pfad, von dem aus es tatsächlich geladen wurde. Zum Beispiel, Wenn die Assembly aus dem Internet heruntergeladen wurde, kann ihre CodeBase Beginnen Sie mit "http: //", aber der Speicherort kann mit "C: \" beginnen. Wenn der Datei wurde Schattenkopie kopiert, der Ort wäre der Pfad zur Kopie von die Datei im Schattenkopierverzeichnis.

Es ist auch gut zu wissen, dass es nicht garantiert ist, dass die CodeBase festgelegt wird für Baugruppen im GAC. Der Ort wird immer für Baugruppen festgelegt jedoch von der Festplatte geladen.

Daher würde ich folgendes verwenden:

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

Was für mich gelöst wurde, war das Setzen der Eigenschaft "Copy Local" für die nunit.framework.dll-Referenz im Testprojekt auf "true".

0
HS1

Wenn Sie nach dem Deaktivieren von "shadow build" Ein Run- und Build-Problem ausgeführt haben, müssen Sie zuerst die Option "Alles bereinigen" aus der Build-Option auswählen und anschließend Ihr Projekt auf "shadow build" deaktivieren

0
user7216927