2009-09-16 22 views
2

我有一個 「命令」 類:如何爲WPF命令綁定編寫測試?

public static class MyCommands 
{ 
    private static ICommand exitCommand = new RoutedCommand(); 

    public static ICommand ExitCommand { get { return exitCommand; } } 
} 

在MainWindow.xaml.cs代碼隱藏:

private void BindCommands() 
{ 
    this.CommandBindings.Add(new CommandBinding(MyCommands.ExitCommand, this.Exit)); 
} 

private void Exit(object sender, ExecutedRoutedEventArgs e) 
{ 
    Application.Current.Shutdown(); 
} 

而一些XAML中實現了一個菜單欄的用戶控件:

<MenuItem Header="_Exit" 
      Command="{x:Static local:MyCommands.ExitCommand}" 
      /> 

該代碼有效。我喜歡涉及的一般模式,我想繼續使用它。然而,我也在努力追求其他一些目標,比如做測試驅動開發,並通過我的單元和集成測試實現100%的覆蓋率。我還希望100%符合StyleCop和FxCop警告。我被抓到了這裏。

我的MainWindow.Exit()方法是私人的,正如FxCop(Microsoft.Security:CA2109)所建議的,但這意味着我無法直接從測試中調用它。我想我可以公開並禁止FxCop消息。或者我可以使用訪問器。但是我反對直接針對私有方法編寫測試的偏見,特別是在這種情況下,因爲所做的只是測試方法,而不是測試命令綁定本身。

我覺得必須有一些其他方式來從我的測試代碼中調用命令,以便我可以驗證命令是否按預期工作(除了手動測試)。有什麼建議麼?

回答

0

使用獨立的表示模式(如MVVM)將允許您測試大部分代碼,包括命令後面的邏輯。然後,這些視圖變得非常簡單,對單元測試來說不那麼重要我建議你閱讀MVVM和相關模式。

+0

我的代碼隱藏事件處理程序將主要是單行程序 - 無論是簡單的UI邏輯(如示例中)或API模型代碼方法。我也計劃使用注入依賴,所以我可以嘲笑像Application.Current這樣的事情,並驗證Shutdown()被調用。 但我不知道如何觸發命令,以便我的測試過程中運行我的事件處理程序。就像我說過的,我可以使用訪問器來調用私有方法,但我真的很想使用指令系統來自動驗證所有內容是否正確連接在一起。 – mlibby 2009-09-17 15:48:21

5

我意識到這是一個古老的問題,但我想我會回答,以防萬一它幫助其他人。

您可以調用從代碼隱藏命令與此:

ICommand command = ExitCommand; 

command.Execute(); 

這將執行退出()和不需要的訪問。這是你在找什麼?

+0

哇,現在我知道如何去測試我的視圖模型,他們完全依賴於命令(這些命令是由私有方法支持的) – 2018-01-26 16:13:24