Mam kilka testów jednostkowych, które piszę dla aplikacji WPF, i tak bardzo, jak próbowałem tego uniknąć, mam pewien testowany kod, który tworzy instancję View. Natychmiast po utworzeniu widoku oceniane są wszystkie rozszerzenia znaczników, style itp. Aby rozwiązać ten problem Utworzyłem atrapę Zastosowanie i zarejestrował żadnych wymaganych zasobów, gdy zespół testowy jest inicjowany:Testowanie jednostek WPF Aplikacja z pakietem siteoforigin 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);
}
}
}
Użyłem tego podejścia w przeszłości, i to działa ok.
Z takim podejściem wpadłem w mały szkopuł. Mam kilka zasobów, które używają pakietu : // siteoforigin: w pakiecie Uri, a gdy testy tworzą ten widok, pojawia się błąd dotyczący niemożności rozwiązania tego pliku.
XAML:
<ResourceDictionary
xmlns="...">
<ImageBrush
x:Key="ResourceName"
ImageSource="pack://siteoforigin:,,,/Resources/image.png"
/>
</ResourceDictionary>
Komunikat o błędzie:
Could not find a part of the path 'C:\\Solution\\TestResults\\Workspace_2012-03-01 14_54_29\\Resources\\image.png'
Dodałem katalog zasobów jako element wdrażania, a ja już potwierdziła, że obraz jest Katalog wyjściowy programu TestRun. Wydaje się, że AppDomain działa jeden folder wyżej, gdzie położenie moich zestawów testowych, ponieważ plik jest faktycznie znajduje się pod adresem:
c: \ Rozwiązanie \ tego testu \ Workspace_2012-03-01 14_54_29 \ Out \ Resources \ image.png
Jakieś sugestie, w jaki sposób mogę uzyskać aplikację WPF do używania katalogu Out, ponieważ jest to folder główny?
Czy ręczne wymuszanie folderu podstawowego w Appdomain działa ręcznie? 'AppDomain.CurrentDomain.SetData ("APPBASE", "FolderNameHere");' Wydaje się, że istnieje lepszy sposób, ale moja pamięć ja niepowodzeniem. Może to być wystarczająco dobre (tm). – ianschol
Wkopiam się w to przez wiele godzin. AppDomain.CurrentDomain.BaseDirectory zwraca folder Out. – bryanbcook