Laden...

Unit Test, wie krieg ich den Namen des Zielverzeichnisses raus?

Erstellt von Seikilos vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.338 Views
S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren
Unit Test, wie krieg ich den Namen des Zielverzeichnisses raus?

Ich habe einen Unit Test in C# gebaut, der mehrere DLLs benötigt. Die kopiert die IDE beim Start auch immer korrekt in ein "TestResults\TEMPORÄRER_NAME" Verzeichnis.
Mein Problem ist, das kopieren reicht nicht. Der temporäre Name, also das Verzeichnis wird nach der Ausführung des Tests ja gelöscht und durch eine trx Datei ersetzt.

Der Haken an der Sache, bei dem erstellen dieses temporären Verzeichnissen kopiert die IDE zwar DLLs, aber das Ergbnis ist kein funktionsfähige Testanwendung. Da eine der kopierten DLLs dynamisch zur Laufzeit eine DLL nachläd, welche aber nicht in das temporäre Verzeichnis kopiert worden ist.
Ich kann die betroffene DLL nicht als Referenz in das Projekt einfügen, weil es keine gültige Net oder Com DLL ist.
Wie soll man mit so etwas umgehen? Wie stelle ich sicher, dass diese DLL gefunden werden kann?

Edit: Ich habe schon versucht den Pfad, wo die DLLs liegen, die nicht mitkopiert werden als Referenz Pfad anzugeben, aber das funktioniert nicht.
Ich kannes auch nicht in den globalen Environment Path aufnehmen, weil so das Projekt auf anderen Rechnern nicht mehr geht

Life is a short

Z
403 Beiträge seit 2007
vor 13 Jahren

Hallo Seikilos,

kannst du die dll nicht in das Projekt hinzufügen und einstellen "kopieren wenn neuer" ?

André

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren

Ne, sagte ja, kann diese nicht als Referenz hinzufügen, oder meinst du was anderes mit "hinzufügen" ?

Life is a short

0
767 Beiträge seit 2005
vor 13 Jahren

Versuchs mal im PostBuild event mit zukopieren.

Ich nenn sowas "Softreferenz" 😃 Wird beim kompilieren nicht gebraucht, beim Ausführen aber schon.

loop:
btst #6,$bfe001
bne.s loop
rts

Z
403 Beiträge seit 2007
vor 13 Jahren

Hallo Seikilos,

ich meine nicht als referenz Hinzufügen sondern im Projekt -> Rechtsklick -> Hinzufügen
-> Vorhandenes Element -> DLL auswählen.

André

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren

Versuchs mal im PostBuild event mit zukopieren.

Ja, aber wohin denn? Das ist doch der Titel meines Threads. Der Name wird aus meinem benutzernamen und Gruppennamen meines Rechners plus einem zeitstempel dynamisch generiert. Daher temporärer Name. Das ist ein C# Test Projekt, kein C# Projekt. Es werden dort spezielle Verzeichnisse angelegt und wieder gelöscht und für die finde ich kein Makro

Life is a short

H
208 Beiträge seit 2008
vor 13 Jahren

Da eine der kopierten DLLs dynamisch zur Laufzeit eine DLL nachläd, welche aber nicht in das temporäre Verzeichnis kopiert worden ist.

Damit ich jetzt nicht dauernd von "der DLL, die die andere DLL nachlädt" sprechen muß, geben wir den beiden erstmal Namen:DLL A wird vom Testprojekt in den temporären Ordner kopiert. DLL A braucht DLL B**, das ist die, die nicht automatisch mitkopiert wird.

Also - das ist jetzt zwar vielleicht nicht die eleganteste Lösung, aber:

Du könntest in DLL A und vor dem dynamischen Nachladen von DLL B prüfen ob diese im gleichen Ordner vorhanden ist, und wenn nicht, kopierst Du sie vorher.
DLL A würde in diesem Moment ja schon im temporären Ordner liegen, also kennt sie in dem Moment den exakten Ordnernamen wo DLL B hinmuß (nämlich der, in dem sich DLL A selbst befindet).

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren

@TheGear, ich konnte es noch nicht testen, daher habe ich dazu noch nichts gesagt.

@haarrrgh: Die DLLs sind alle 3rdparty. Sprich kein Source vorhanden

Life is a short

H
208 Beiträge seit 2008
vor 13 Jahren

Dann mach es am Anfang von Deinem Unit Test. Oder erstelle eine weitere DLL, die das macht was ich beschrieben hatte und die VOR den anderen DLLs aufgerufen wird.

An irgendeinem Punkt halt, wo der Code schon im temporären Ordner liegt, aber bevor DLL A und B benutzt werden.

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo Seikilos,

evtl. hilft dir das DeploymentItemAttribute.

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren

Hallo,
entschuldigt die späte Antwort.

Also das Hinzufügen zum Projekt und Kopieren wenn neuer funktioniert nicht. Die DLLs werden nicht kopiert.

DeploymentItem ist zu umständlich, wenn ich 100 Methoden habe, muss ich 100 mal dutzende von DeploymentItems haben, weils laut hier How to: Configure Test Deployment nur auf Methoden angewendet werden kann.

Die Idee mit einer zusätzlichen DLL ist nicht gerade handlich und erfordert Workarounds fürs drumherum, eventuell werde ich es aber testen, wenn keine bessere Alternative existiert.

Life is a short

X
1.177 Beiträge seit 2006
vor 13 Jahren

huhu,

äh, schön für die späte Antwort, dann kann ich auch noch sagen - und ich hoff ich versteh dich nicht falsch - bzw. hab ich noch nie nachgeguckt wohin VS meine dll's bei nem Test hinkopiert; naja, ich zitiere mal Herbivore

Leider liefert Assembly.GetEntryAssembly in bestimmten Fällen das falsche Ergebnis (null), z.B. wenn man im Visual Studio eine NUnit test.dll mit dem NUnit-Gui startet. Kann das vorkommen, kann man

Path.GetDirectoryName (Assembly.GetExecutingAssembly ().Location);  

verwenden (also mit Assembly.GetExecutingAssembly). Dieser Code muss dann jedoch unbedingt im Code der EXE selbst stehen. Er darf dann nicht in einer DLL stehen, zumindest nicht, wenn die DLL in einem anderen Verzeichnis liegt. Es würde dann das Verzeichnis der DLL ermittelt werden.

siehe [FAQ] Pfad zur eigenen Anwendung (EXE) ermitteln

Das wichtige ist der letzte Satz.

Preisfrage: liegt deine test-dll im selben Verzeichnis wie die anderen und wo du die "fehlende" hin haben willst?

😃

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren

Also die TestDLL wird ins gleiche Bin verzeichnis generiert, wie alle anderen und dann temporär kopiert.

Ich habe im MSDN Forum jedoch bereits eine hilfreiche Antwort bekommen:

Eine "name".testrunconfig Datei anlegen, oder die vorhandenen LocalSettings.testrunconfig editieren.
Dort enable deployment auswählen und die DLLs eintragen, die zusätzlich kopiert werden sollen.
Dann läufts ohne manuellem kopieren.

Life is a short