2012-03-01 6 views
5

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?

+0

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

+0

Wkopiam się w to przez wiele godzin. AppDomain.CurrentDomain.BaseDirectory zwraca folder Out. – bryanbcook

Odpowiedz

3

To dlatego, że AppDomain.BaseDirectory że jest ustawiony przez badanego biegacz nie ma spływu '/' charakter, to powoduje, że kod, który rozwiązuje siteoforigin ścieżki stracić ostatniego katalogu w ścieżce.

Można to sprawdzić, patrząc na wynik następującego kodu podczas normalnego działania lub podczas testów.

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); 

ten został niedawno fixed w NUnit (wliczone w 2.6), ale nadal może być problem z innych biegaczy testowych.

Jeśli jesteś zainteresowany to jest odpowiednikiem tego, co robi kod siteoforigin:

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

Spróbuj, że z lub bez ukośnika w baseDirectory.

+0

Tak, przyczyną jest ukośnik. Odkryłem to wkrótce po opublikowaniu i nie wróciłem, aby dodać moje ustalenia, ale i tak przyjmuję twoją odpowiedź.W rzeczywistości używam MSTest w 2010 roku, który również nie umieszcza końcowego ukośnika. – bryanbcook

+0

Dzięki, zredagowałem, aby usunąć założenie o NUnit. –