2013-07-17 21 views
10

Ho appena iniziato a sperimentare moq per il test dei moduli dell'unità.Ottenere il percorso di montaggio desiderato/corretto durante il collaudo dell'unità con NUnit

In realtà, la classe per cui devo scrivere un test unità utilizza

Assembly.GetExecutingAssembly().Location internamente per determinare un percorso.

Ma, questo non funziona durante la scrittura di unit test perché, il percorso del gruppo di esecuzione è differente (è preso il percorso del gruppo unit testing)

AppData\\Local\\Temp\\3ylnx32t.ukg\\TestApplication.Test\\assembly\\dl3\\aeb938e6\\f3664631_d982ce01.

Ho provato, disabilitando la copia shadow.

AppDomainSetup appDomain= new AppDomainSetup{ShadowCopyFiles = "false",}; 
appDomain.ShadowCopyFiles=false.ToString(); 

ancora, non funziona!

Qualsiasi suggerimento è gradito. Grazie in anticipo.

+0

Ho avuto alcuni problemi con i percorsi di montaggio durante test di unità, pure. Probabilmente aiuta, date un'occhiata a http://stackoverflow.com/questions/17313831/get-path-of-referenced-project-during-unit-testing –

+1

@OP Dubito che questo sia un problema con moq. Quale framework di test stai usando?NUnit, ad esempio, esegue i test in un AppDomain separato con ShadowCopy abilitato. –

risposta

1

Infine, ho compiuto questo attraverso questo modo:

ho usato quadro NUnit e disabili ombra la copia in NUnit. Crea una copia del mio file di configurazione in quella directory in cui viene richiamata la libreria di test delle unità.

Quindi, ogni volta che viene invocato il mio test di unità (ad esempio dal percorso 'A'), la mia applicazione non si lamenta del fatto che non c'è alcun file di configurazione in quella posizione poiché ho messo il mio file di configurazione nel percorso 'A'.

(ps: Il motivo per cui ho la posizione di montaggio è quello di essere in grado di trovare il mio file di configurazione in quella posizione)

[L'idea è questa: con la copiatura ombra, il percorso di montaggio è dinamico. disabilitarlo e il percorso di montaggio è statico]

+0

Come hai disattivato ShadowCopy? Ho provato tutti i tipi di codice e nulla sembra spegnerlo. Puoi darci un campione? – Erick

+0

In realtà, ho disabilitato la copia shadow in NUnit. Vai su Strumenti-> Impostazioni e deseleziona la casella di controllo "Abilita copia shadow". Questo dovrebbe fare il trucco. –

+0

Ah. Ho pensato che tu l'avessi rimosso dall'app. Ho cercato di rimuoverlo dalla mia app desktop e nulla sembra funzionare. – Erick

4

Forse non è una risposta esatta alla tua domanda, ma personalmente, non proverei nemmeno a ottenere il valore effettivo di Assembly.GetExecutingAssembly().Location durante un test unitario. Mi piacerebbe creare qualcosa di simile:

public interface IAssemblyHelper 
{ 
    string GetLocationOfExecutingAssembly(); 
} 

public class AssemblyHelper : IAssemblyHelper 
{ 
    public string GetLocationOfExecutingAssembly() 
    { 
     return Assembly.GetExecutingAssembly().Location; 
    } 
} 

In fase di esecuzione, mi piacerebbe iniettare AssemblyHelper nel costruttore della classe che ha richiesto, come IAssemblyHelper. Nei test unitari, mi piacerebbe prendere in giro IAssemblyHelper, configurarlo per restituire un percorso previsto e passare la simulazione nel costruttore della classe.

Verificare che il codice funzioni con un percorso di posizione del gruppo di esecuzione effettivo nell'applicazione deve essere parte di un test di accettazione.

+0

Il punto che utilizza un percorso relativo è così quando gli altri che controllano il tuo codice su un percorso diverso da quello che ti aspetti, funzioneranno comunque. "configuralo per restituire un percorso previsto"/percorso hardcoded -1 – TamusJRoyce

+0

@TamusJRoyce Hai frainteso. Questo non ha nulla a che fare con i percorsi relativi o il check-out del codice. Sto sostenendo la creazione di ** un mock ** di 'IAssemblyHelper' per restituire una stringa conosciuta per il percorso che può essere asserita nei test unitari. Nel codice runtime, la chiamata passerebbe alla classe concreta 'AssemblyHelper' e restituirà la posizione del gruppo di esecuzione effettivo. –

1

Il mio collega ha suggerito una soluzione dopo che funziona per tutti i nostri casi di utilizzo:

public static string AssemblyDirectory 
{ 
    get 
    { 
     string codeBase = Assembly.GetExecutingAssembly().CodeBase; 
     var uri = new UriBuilder(codeBase); 
     string path = Uri.UnescapeDataString(uri.Path); 
     return Path.GetDirectoryName(path); 
    } 
}