2009-08-13 21 views
4

私は現在MSPaintのようなWPFアプリケーションである私のプロジェクトに取り組んでいます。しかし、私は鉛筆ツールや類似のものではなく、オブジェクト(長方形、円、三角形など)でペイントしません。私はPrismとMVVMモデルを使用して、テスト容易性と保守性を実現しています。ユニットテスト機能はMouseEventArgsに依存していますか?

私は今問題に遭遇しました。私は、キャンバスを描くキャンバス(名前が示すように)であるCanvasView.xamlを持っています。私は、ViewModelのコマンドをキャンバス上のマウスアクションにバインドする方法を提供するために、カスタムPrism CommandBehaviors(つまり、MouseDownCommandBehavior)を実装しました。

基本的な設定は次のようになります。

public DelegateCommand<MouseEventArgs> MouseLeftButtonDownCommand { get; set; } 

public CanvasViewModel(ICanvasView view, IEventAggregator eventAggregator) : base(view) 
{ 
    m_View = view; 
    m_EventAggregator = eventAggregator; 
    m_EventAggregator.GetEvent<ToolboxSelectionChangedEvent>().Subscribe(OnToolboxSelectionChanged); 


    MouseLeftButtonDownCommand = new DelegateCommand<MouseEventArgs>(OnMouseLeftButtonDown); 
} 

public void OnMouseLeftButtonDown(MouseEventArgs args) 
{ 
    Point position = m_View.GetPosition(args); 

    if(SelectedObject!=null){ 
     PaintObject po = SelectedObject.Clone(); 
     Canvas.SetLeft(po,position.X); 
     Canvas.SetTop(po,position.Y); 
     PaintObjects.Add(po); 
    } 
} 

コードに存在するいくつかのものではない:

  • PaintObjects PaintObjectのコレクションは、ビュー上のItemsControlには
  • に結合することをオブジェクトされますPaintObjectは、使用可能なすべてのPaintObjects(Rectangle、Circle、Triangleなど)の基本クラスです。
  • SelectedObject(タイプPaintObject)が決定されます。b他のPrismモジュール(Toolbox)での選択プロセス

問題はどうやってOnMouseLeftButtonDownメソッドを単体テストできますか?問題は、MouseEventArgsに大きく依存しているため、MouseEventArgsをモック/スタブするための良い方法はわかりません。

答えて

2

追加のレイヤーを使用して、マウスイベントを消費して放射します。次に、ユニットテストのためにそのレイヤーをスタブ/モックすることができます。

+0

例を挙げてください。 – chrischu

5

私はWPFイベントルーティングシステムを使用して、このタイプのユニットテストを添付プロパティで実行できました。これはUIElement(Windowsなど)の他の子孫と同じように動作すると仮定します。このコードスニペットで.RaiseEvent()メソッドは、UIElementのクラスによって提供されているので:

[TestMethod] 
    public void ThingsShouldHappenWhenMouseIsClicked() 
    { 
    // ARRANGE 
    var itemsControl = new ItemsControl(); 
    var myDependencyMock = new Mock<IMyDependency>(); 
    // provide dependency to a dependency property 
    MyAttachedProperty.SetDragDropHandler(itemsControl, myDependencyMock.Object); 

    var leftClickEventArgs = new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left) 
    { 
     RoutedEvent = UIElement.PreviewMouseLeftButtonDownEvent, 
     Source = _itemsControl 
    }; 

    // ACT 
    itemsControl.RaiseEvent(leftClickEventArgs); 

    // ASSERT 
    myDependencyMock.Verify(x => x.TheThingHappened()); 
    } 

私は、これはあなたがあなたの質問に記載されてきた特定のコントロールの種類に適用されるかどうかを特定するために100%伝えることはできませんしかし、うまくいけば、このスニペットは誰かに役立つでしょう。

関連する問題