2012-03-01 8 views
5

Ho alcuni test unitari che sto scrivendo per un'applicazione WPF, e per quanto ho cercato di evitarlo, ho un codice sotto test che istanzia una Vista. Non appena la vista viene istanziata, vengono valutate tutte le estensioni di markup, gli stili, ecc. Per risolvere questo ho creato un manichino Application e registrato tutte le risorse necessarie quando il montaggio di prova viene inizializzato:Unit Testing Applicazione WPF con siteoforigin pack Uri

[TestClass] 
public class AssemblyInitialize 
{ 
    [AssemblyInitialize] 
    public static void SetupTestAssembly(TestContext context) 
    { 
     if (Application.Current == null) 
      new Application(); 

     var resources = new List<string> 
      { 
       "pack://application:,,,/AssemblyName;component/ResourceDictionary.xaml" 
      }; 

     foreach(var resource in resources) 
     { 
      var uri = new Uri(resource); 
      var dictionary = new ResourceDictionary { Source = uri }; 
      Application.Current.Resources.MergedDictionaries.Add(dictionary); 
     } 
    } 
} 

Ho usato questo approccio in passato, e funziona bene.

Ho incontrato un piccolo problema con questo approccio. Ho alcune risorse che usano il pacchetto : // siteoforigin: nel pacchetto Uri, e quando i test creano un'istanza di questa vista ottengo un errore sul non essere in grado di risolvere il file.

Il XAML:

<ResourceDictionary 
    xmlns="..."> 

    <ImageBrush 
     x:Key="ResourceName" 
     ImageSource="pack://siteoforigin:,,,/Resources/image.png" 
     /> 
</ResourceDictionary> 

messaggio di errore:

Could not find a part of the path 'C:\\Solution\\TestResults\\Workspace_2012-03-01 14_54_29\\Resources\\image.png' 

Ho aggiunto la directory delle risorse come un elemento di distribuzione, e ho confermato che l'immagine è il Directory di output di TestRun. Sembra che il dominio di applicazione è in funzione una cartella sopra dove la posizione delle mie linee di prova, perché il file è in realtà trova in:

c: \ Solution \ TestResults \ Workspace_2012-03-01 14_54_29 \ Out \ Resources \ image.png

Qualche suggerimento su come posso ottenere che l'applicazione WPF utilizzi la directory Out come cartella principale?

+0

Funziona per forzare manualmente la cartella di base dell'appodominio? 'AppDomain.CurrentDomain.SetData (" APPBASE "," FolderNameHere ");' Sembra che ci sia un modo migliore, ma la mia memoria mi sta fallendo. Questo potrebbe essere abbastanza buono (tm). – ianschol

+0

Hai scavato in questo per ore. AppDomain.CurrentDomain.BaseDirectory restituisce la cartella Out. – bryanbcook

risposta

3

Questo perché il AppDomain.BaseDirectory che è impostata dall'amministratore di test runner non ha un finale '/' carattere, questo fa sì che il codice che risolve siteoforigin percorsi di perdere l'ultima directory nel percorso.

È possibile controllare ciò osservando il risultato del seguente codice durante l'esecuzione normale o nei test.

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); 

Questo è stato recentemente fixed in NUnit (incluso nel 2.6), ma può ancora essere un problema con altri corridori di test.

Se siete interessati questo è l'equivalente di ciò che il codice di siteoforigin sta facendo:

new Uri(new Uri(baseDirectory), "some/relative/path.jpg").LocalPath 

Prova che, con e senza una barra finale in baseDirectory.

+0

Sì, la barra finale è il colpevole. L'ho scoperto poco dopo la pubblicazione e non sono tornato per aggiungere le mie conclusioni, ma accetterò comunque la tua risposta.In realtà sto usando MSTest nel 2010, che non inserisce nemmeno la barra finale. – bryanbcook

+0

Grazie, ho modificato per rimuovere l'ipotesi su NUnit. –