2009-04-14 13 views
11

Ho una finestra semplice con un riferimento a una risorsa statica in App.xaml.Test di una finestra WPF con risorse statiche

App.xaml definizione di risorsa:

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

componets finestra usando la risorsa:

<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}}"/> 

Quando si cerca di unit test questa finestra ottengo l'errore:

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.

Is c'è un modo per aggirare questo? Il mio codice di prova dell'unità è:

[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

La soluzione possibile potrebbe essere quella di sostituire StaticResource con il binding di DynamicResource – Boogier

risposta

12

Grazie Kent,

Ho guardato i vostri suggerimenti e nella maggior parte degli scenari sono d'accordo modelli dovrebbero essere utilizzati e testati tuttavia, c'è qualche codice associato con i controlli (per esempio visibilità TextBox) ho ancora voluto mettere alla prova. Per aggirare questo è possibile creare un'istanza della propria applicazione (ma non inizializzarla) e aggiungere le risorse manualmente. Questo porta alla duplicazione in App.xaml e al test dell'unità di base, ma questo mi permette di completare i test che volevo.

 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 perché questo ha contribuito ad uscire da un legame simile .. grazie! – PaulJ

+4

ha avuto un problema simile, basta chiamare app.InitializeComponent() accanto alla creazione dell'istanza. i dizionari delle risorse verranno popolati. Questo è ciò che fa il metodo principale. Questo è lo snippet del metodo principale, puoi saltare l'app. Esegui come stiamo testando qui. [System.STAThreadAttribute()] [System.Diagnostics.DebuggerNonUserCodeAttribute()] public static void Main() { WPFComboBox.App app = new WPFComboBox.App(); app.InitializeComponent(); app.Correre(); } – ioWint

+1

Inoltre, se si sta utilizzando una risorsa statica per basare uno 'Stile' di' UserControl' su predefinito, come '