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?
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
Hai scavato in questo per ore. AppDomain.CurrentDomain.BaseDirectory restituisce la cartella Out. – bryanbcook