6

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

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

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

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は、ビューのItemsControlがバインドするPaintObjectオブジェクトのコレクションです。
  • PaintObjectは、使用可能なすべてのPaintObject(Rectangle、Circle、Triangleなど)の基本クラスです。
  • SelectedObject(タイプPaintObject)は、別のPrismモジュール(ツールボックス)の選択プロセスによって決定されます。

問題は、OnMouseLeftButtonDownメソッドをユニットテストするにはどうすればよいですか?問題は、MouseEventArgsに大きく依存しており、MouseEventArgsをモック/スタブする良い方法がわからないことです。

4

2 に答える 2

8

WPFイベントルーティングシステムを使用して、プロパティがアタッチされたこのタイプの単体テストを実行できました。.RaiseEventがあるため、UIElementの他の子孫(Windowsなど)でも同じように機能すると思います。このコードスニペットの()メソッドは、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%確実に判断することはできませんが、このスニペットが誰かに役立つことを願っています。

于 2013-06-27T01:00:10.100 に答える
3

追加のレイヤーを使用して、マウスイベントを消費および発行します。次に、単体テストのためにそのレイヤーをスタブ/モックアウトできます。

于 2009-08-13T15:41:11.190 に答える