2009-04-14 49 views
11

我有一個簡單的Window,引用了App.xaml中的StaticResource。使用StaticResources測試WPF窗口

App.xaml中的資源定義:

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

當試圖單元測試這個窗口,我得到的錯誤:

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.

是使用資源

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

窗口成品的配件有沒有辦法解決這個問題?我的單元測試代碼是:

[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

可能的解決方案可能是用DynamicResource綁定替換StaticResource – Boogier 2018-01-24 15:45:48

回答

12

感謝肯特,

我看着你的建議,在大多數情況下我同意模型應使用測試然而,有一個與我還是想考控件(例如文本框可見性)相關的一些代碼。爲了解決這個問題,你可以創建你的應用程序的實例(但不能初始化它)並手動添加資源。這確實會導致App.xaml和基本單元測試的重複,但這使我可以完成我想要的測試。

 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這有助於擺脫類似的束縛。謝謝! – PaulJ 2009-05-01 20:17:30

+4

有一個類似的問題,只需在創建實例旁邊調用app.InitializeComponent()即可。資源字典將被填充。事實上,這是什麼主要方法。這是主要方法的片段,你可以跳過應用程序。我們正在這裏進行單元測試。 [System.STAThreadAttribute()] [System.Diagnostics.DebuggerNonUserCodeAttribute()] public static void Main(){ WPFComboBox.App app = new WPFComboBox.App(); app.InitializeComponent(); 應用程序。跑(); } – ioWint 2011-08-31 23:53:45

+1

另外,如果您使用靜態資源將`UserControl`的`Style`設置爲默認值,如`