2013-06-26 8 views
5

Provo a testare la funzionalità di una classe nella mia applicazione Web (ASP.Net), utilizzando i test unitari. Questa classe carica alcuni file da hard disk (per eseguire trasformazioni XSL):Ottieni il percorso del progetto di riferimento durante il test dell'unità

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

Questo percorso viene correttamente risolto durante il debug del webapplication stesso. Ma ogni volta che avvio il test unitario (che risiede in un progetto di test separato, facendo riferimento al progetto dell'applicazione web), ottengo invece il percorso del progetto di test.

È possibile ottenere il percorso dell'applicazione web in questo scenario o devo utilizzare un approccio diverso? Qualsiasi suggerimento è apprezzato.

Cordiali saluti, Kai Hartmann

risposta

0

Ok, questo ha dato il suggerimento: Can a unit test project load the target application's app.config file?

Nel file .testsettings, aggiunto dal progetto di test per il mio progetto WebApplication, Posso aggiungere file e cartelle che dovrebbero essere copiati nella cartella di debug dei progetti di test ogni volta che viene eseguito il test.

Quindi dopo questo posso fare riferimento ai file xsl per AppDomain.CurrentDomain.BaseDirectory.

Inoltre, per mantenere anche la struttura delle cartelle, ho dovuto fare ciò che è stato descritto qui: Visual Studio Test Project - Does not copy folder on deployment

ho dovuto modificare il file .testsettings con un editor di testo e aggiungere il parametro OutputDirectory. Successivamente ho riavviato Visual Studio e, quando ho avviato il progetto di test, la cartella e i file sono stati copiati correttamente.

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#

Spero che questo è utile .. :)

+4

L'assembly in esecuzione sarebbe il progetto più semplice. Avresti sbagliato strada. –

+1

Ciao. È utile in generale, perché fornisce il percorso dell'assembly in esecuzione. :) Ma nel mio caso restituisce anche una sottocartella del progetto di test. Quello di cui ho bisogno è il percorso in cui si trova la classe o qualcosa del genere. –

4

Vi suggerisco di fare qualcosa di simile:

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

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

Chiamate Load() nella vostra applicazione Web, ma utilizzate la versione sovraccaricata di questo metodo nella vostra applicazione non desiderata. Potresti considerare di aggiungere il file xslt come una risorsa al tuo progetto.

si sarebbe in grado di caricare il percorso in questo modo:

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

Sì, questo potrebbe essere valido. L'unico inconveniente è che devo usare il parametro path in ogni metodo genitore. Forse dovrò riconsiderare la mia istanza di classe e fornire il percorso attraverso il costruttore. –

+0

Com'è che un inconveniente? Potresti rendere base una classe che contiene gli overload di metodi e implementarli lì. Inoltre, l'esempio 'Path.GetDirectoryName' sarebbe sufficiente, in teoria –

+0

L'esempio Path.GetDirectoryName restituisce anche il percorso del progetto di test.Quello che intendo con svantaggio è che ogni metodo nel callstack dalla chiamata nel progetto di test fino al metodo che carica il file nell'applicazione web dovrebbe ottenere quel parametro. Qualcosa come class.LoadXsl (percorso) -> class.LoadXsl2 (percorso) -> class.Load (percorso). –

Problemi correlati