2013-06-26 14 views
5

Ich versuche, die Funktionalität einer Klasse in meiner (ASP.Net) -Webanwendung mithilfe von Komponententests zu testen. Diese Klasse lädt einige Dateien von Festplatte (XSL-Transformationen durchzuführen):Pfad des referenzierten Projekts während des Komponententests abrufen

Xsl = GetXSLFromFile(AppDomain.CurrentDomain.BaseDirectory + "\XML Transformationen\Transformation_01.xslt") 

Dieser Pfad korrekt beim Debuggen der Webapplikation selbst behoben ist. Aber immer wenn ich den Komponententest starte (der sich in einem separaten Testprojekt befindet und auf das Projekt der Webapplikation verweist), erhalte ich stattdessen den Pfad des Testprojekts.

Ist es möglich, den Pfad der Webapplikation in diesem Szenario zu erhalten, oder muss ich einen anderen Ansatz verwenden? Alle Hinweise sind willkommen.

Mit freundlichen Grüßen, Kai Hartmann

Antwort

0

Ok, gab dies den Hinweis: Can a unit test project load the target application's app.config file?

In der .testsettings Datei durch das Testprojekt zu meinem Webapplikation Projekt hinzugefügt, Ich kann Dateien und Ordner hinzufügen, die bei jeder Ausführung des Tests in den Debug-Ordner des Testprojekts kopiert werden sollen.

Also danach kann ich die xsl-Dateien per AppDomain.CurrentDomain.BaseDirectory verweisen.

Zusätzlich zu halten auch die Ordnerstruktur, hatte ich zu tun, was hier beschrieben wurde: Visual Studio Test Project - Does not copy folder on deployment

ich die .testsettings mit einem Texteditor-Datei zu bearbeiten hatte, und die Parameter ausgabe hinzuzufügen. Danach habe ich Visual Studio neu gestartet, und wenn das Testprojekt gestartet wurde, wurden der Ordner und die Dateien korrekt kopiert.

3
string path; 
path = System.IO.Path.GetDirectoryName( 
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 

HOW TO: Determine the Executing Application's Path

Getting the path of a executable file in C#

Hoffe, das ist hilfreich .. :)

+4

Die ausführende Baugruppe wäre das Unittest-Projekt. Du würdest den falschen Weg bekommen. –

+1

Hallo. Dies ist im Allgemeinen hilfreich, da es den Pfad der tatsächlich ausgeführten Assembly angibt. :) Aber in meinem Fall gibt es auch einen Unterordner des Testprojekts zurück. Was ich brauche, ist der Pfad, in dem sich die Klasse befindet oder so. –

4

Ich schlage vor, Sie so etwas tun:

public class MyXslFileLoader 
{ 
    public void Load() 
    { 
     Load(AppDomain.CurrentDomain.BaseDirectory + "\XML Transformationen\Transformation_01.xslt"); 
    } 

    public void Load(string path) 
    { 
     Xsl = GetXSLFromFile(path); 
    } 
} 

Sie würden in Ihrer Webanwendung Load() aufrufen, aber verwenden Sie die überladene Version dieser Methode in Ihrer Unittest-Anwendung. Sie könnten in Erwägung ziehen, die XSLT-Datei als Ressource zu Ihrem Projekt hinzuzufügen.

Sie in der Lage wären, den Pfad so zu laden:

var webApplicationDllPath = Path.GetDirectoryName(typeof(ClassInTheWebApplicationDll).Assembly.GetName().CodeBase); 
+0

Ja, das könnte machbar sein. Der einzige Nachteil ist, dass ich den Pfadparameter in jeder übergeordneten Methode verwenden muss. Vielleicht muss ich meine Klasseninstanziierung überdenken und den Pfad durch den Konstruktor angeben. –

+0

Wie ist das ein Nachteil? Sie könnten eine Klasse erstellen, die die Methodenüberladungen enthält, und sie dort implementieren. Außerdem würde das Beispiel 'Path.GetDirectoryName' ausreichen, theoretisch –

+0

Das Beispiel Path.GetDirectoryName gibt auch den Pfad des Testprojekts zurück.Was ich mit Nachteil meine, ist, dass jede Methode im Callstack vom Aufruf im Testprojekt bis zur Methode, die die Datei in die Webapplikation lädt, diesen Parameter bekommen müsste. Etwas wie class.LoadXsl (Pfad) -> class.LoadXsl2 (Pfad) -> class.Load (Pfad). –

Verwandte Themen