2009-04-14 14 views
11

Mam proste okno z odniesieniem do StaticResource w pliku App.xaml.Testowanie okna WPF za pomocą StaticResources

App.xaml definicja zasobu:

<!-- Standard Text Box Style --> 
<Style x:Key="textBoxStyleStd" TargetType="{x:Type TextBox}"> 
    <Setter Property="FontSize" Value="14" /> 
</Style> 

okienne componets korzystające z zasobów:

<TextBlock Grid.Column="1" Grid.Row="0" Name="stationIdTitle" 
      Style="{StaticResource textBlockStyleStd}" 
      VerticalAlignment="Center" HorizontalAlignment="Center" 
      Text="{LocText Key=Title, Dict={StaticResource Dictionary}, 
       Assembly={StaticResource Assembly}}"/> 

podczas próby badanej jednostki Okno to pojawia się błąd:

System.Windows.Markup.XamlParseException: Cannot find resource named '{textBlockStyleStd}'. Resource names are case sensitive. Error at object 'stationIdTitle' in markup file 'Zpg;component/guicomponenets/screens/enterstationidscreen.xaml' Line 23 Position 71.

Czy jest jakiś sposób obejścia tego? Mój kod testowy to:

[Test] 
public void TestEnterKeyPressedNoText() 
{ 
    IPickingBusinessObject pickingBusinessObject = mock.StrictMock<IPickingBusinessObject>(); 

    EnterStationIdScreen objectUnderTest = new EnterStationIdScreen(pickingBusinessObject); 

    Assert.AreEqual(Visibility.Visible, objectUnderTest.stationIdError.Visibility); 

    Assert.AreEqual("werwe", "oksdf"); 

    Replay(); 

    objectUnderTest.EnterKeyPressed(); 

    Verify(); 
} 
+0

Możliwe rozwiązanie polegające na zamianie StaticResource na DynamicResource binding – Boogier

Odpowiedz

12

Dzięki Kent,

Spojrzałem na Państwa sugestie i w większości scenariuszy zgadzam modele powinny być używane i testowane jednak istnieje jakiś kod związany z grupą kontrolną (np widoczności TextBox) Ja nadal chcieli przetestować. Aby to obejść, można utworzyć instancję aplikacji (ale nie zainicjować jej) i ręcznie dodać zasoby. Prowadzi to do powielania w App.xaml i testu jednostki bazowej, ale to pozwala mi zakończyć wymagane testy.

 if (Application.Current == null) 
     { 
      App application = new App(); 

      #region Add Static Resources from the App.xaml 

      Style textBoxStyle = new Style(typeof(TextBox)); 
      textBoxStyle.Setters.Add(new Setter(TextBox.FontSizeProperty, 14d)); 

      Style textBlockStyle = new Style(typeof(TextBlock)); 
      textBlockStyle.Setters.Add(new Setter(TextBlock.FontSizeProperty, 14d)); 

      application.Resources.Add("TextBoxStyleStd", textBoxStyle); 
      application.Resources.Add("TextBlockStyleStd", textBlockStyle); 
      application.Resources.Add("TextBlockStyleError", textBlockStyle); 
      application.Resources.Add("Assembly", "Zpg"); 

      #endregion 
     }  
+0

+1 cos pomogło to z podobnym wiązaniem .. dzięki! – PaulJ

+4

miał podobny problem, wystarczy wywołać app.InitializeComponent() obok tworzenia instancji. słowniki zasobów zostaną zapełnione. O tym, co robi metoda główna. To jest fragment z głównej metody, możesz pominąć aplikację. Uruchom tutaj testy jednostkowe. [System.STAThreadAttribute()] [System.Diagnostics.DebuggerNonUserCodeAttribute()] public static void Main() { WPFComboBox.App app = new WPFComboBox.App(); app.InitializeComponent(); Aplikacja .Biegać(); } – ioWint

+1

Ponadto, jeśli używasz statycznego zasobu do oparcia "Style" użytkownika 'UserControl' na domyślnym, takim jak' ', możesz użyć składnia 'application.Resources.Add (typeof (MyUserControl), new MyUserControl(). Style);' – Jay

6

W kontekście testu urządzenia nie ma uruchomionej aplikacji WPF. Dlatego Window nie znajdzie zasobu.

Moim sposobem obejścia tego będzie nie jednostka przetestować swoje poglądy. Zamiast tego użyj MVVM i przetestuj modele widoku w jednostce. Jeśli chcesz przetestować swoje poglądy, napisz testy integracyjne. Twoje testy integracyjne mogą faktycznie uruchomić aplikację, a tym samym znacznie bardziej naśladować rzeczywistą pracę aplikacji.

3

Kiedy korzystać w pełni kwalifikowane nazwy montażu w moich wpisach zasobów App.xaml, tylko trzeba instanciate App() klasy. W tym przykładzie, wszystkie zasoby leży w zespole Majesty_of_Omega_GUI, który jest określany przez funkcję testu UnitTest.DLL

<Application 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="Majesty_of_Omega.GUI.App" 
StartupUri="Pages/MainPage.xaml" 
> 
<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/Majesty_of_Omega_GUI;component/Resources/MainScreens.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/Majesty_of_Omega_GUI;component/Resources/PanelResources.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/Majesty_of_Omega_GUI;component/Simple Styles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
</Application> 

:

[Test] 
    public void Testfunction() 
    { 
     if (Application.Current == null) 
     { 
      App application = new App(); 
     } 

     SomePage page = new SomePage(); 
+0

Cześć ChaosSpeeder, próbuję to samo, ale nawet wtedy moje zasoby instancji aplikacji nie są zapełnione! – ioWint

+0

ChaosSpeeder, poszedłem z twoim podejściem, a następnie znalazłem, że nie muszę podawać URI na podstawie pakietu! działało nawet bez niego. Ale zostałem zmuszony do wywołania app.InitializeComponent(), aby pobrać słowniki zasobów, które mają zostać wypełnione. – ioWint

+0

To jest dość stary post, ale nie mam powodzenia w tym podejściu, używając identyfikatora URI pakietu z lub bez wywołania InitializeComponent(). –

-1

Faktycznie, można użyć tej samej aplikacji i jeśli zasoby są z tego samego zestawu, musisz wywołać metody InitializeComponents, aby działał (Source here).

Miłego dnia!

+1

Link wygasł. "Dokument, którego szukasz, nie istnieje." –

+0

Oto działający link: http://blog.lexique-du-net.com/index.php?q=WPF+tip+%3A+Jak można w ten sposób użyć +statycznego%2Fdynamic+resources+w+obie + testy –

Powiązane problemy