Frage

Zur Zeit arbeite ich an einem Projekt von mir, die eine MSPaint artigen WPF-Anwendung ist. Allerdings male ich nicht mit Bleistift Werkzeugen oder etwas ähnliches, aber mit Objekten (Rechteck, Kreis, Dreieck etc.). Ich benutze Prism und das MVVM Modell Testbarkeit und Wartbarkeit zu erreichen.

Ich habe jetzt auf ein Problem stoßen. Ich habe einen CanvasView.xaml das ist (wie der Name schon sagt) die Leinwand ich an zu malen. Ich habe benutzerdefinierte Prism CommandBehaviors umgesetzt (dh. MouseDownCommandBehavior) einen Weg, um die Befehle des Ansichtsmodell auf die Mausaktionen auf der Leinwand zu binden.

Die Grundeinstellung sieht wie folgt aus:

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);
    }
}

Einige Dinge, die nicht in dem Code:

  • PaintObjects ist Objekte eine Sammlung von PaintObject dass ein Item auf der Ansicht bindet an
  • PaintObject ist die Basisklasse für alle nutzbaren PaintObjects (Rechteck, Kreis, Dreieck usw.)
  • Die SelectedObject (vom Typ PaintObject) durch einen Auswahlprozess in einem anderen Modul Prism bestimmt (Toolbox)

Die Frage ist, wie kann ich Einheit die OnMouseLeftButtonDown Methode testen? Das Problem ist, dass es stützt sich stark auf MouseEventArgs und ich weiß nicht wirklich eine gute Art und Weise / Stub MouseEventArgs zu verspotten.

War es hilfreich?

Lösung

Verwenden Sie eine zusätzliche Schicht zu konsumieren und Mausereignisse zu emittieren. Dann können Sie Stummel / verspotten, dass die Schicht für die Komponententests aus.

Andere Tipps

Ich habe in der Lage, das WPF-Ereignis-Routing-System zu verwenden, um diese Art von Unit-Tests mit einer daran befestigten Eigenschaft auszuführen, und ich nehme an, dass es das gleiche mit anderen Nachkommen von UIElement (Windows, etc.) funktionieren wird, weil die .RaiseEvent () -Methode in diesem Codefragment wird durch die UIElement-Klasse:

 [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());
  }

Ich kann nicht zu 100% sicher sagen, ob dies auf die spezifischen Kontrolltypen gelten Sie in Ihrer Frage aufgeführt haben, aber hoffentlich wird dieses Snippet jemand hilfreich sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top