Domanda

Attualmente sto lavorando su un mio progetto che è un'applicazione MSPaint-come WPF. Comunque io non dipingo con gli strumenti matita o qualcosa di simile, ma con gli oggetti (rettangolo, cerchio, triangolo, ecc). Io uso Prism e il modello MVVM per raggiungere verificabilità e manutenibilità.

Ora ho incontrato un problema. Ho un CanvasView.xaml che è (come suggerisce il nome) la tela sto dipingendo su. Ho implementato personalizzato Prism CommandBehaviors (es. MouseDownCommandBehavior) per fornire un modo per legare i comandi del ViewModel per le azioni del mouse sulla tela.

La configurazione di base è simile al seguente:

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

Alcune cose non presenti nel codice:

  • PaintObjects è una collezione di oggetti che un PaintObject ItemsControl sul View si lega a
  • PaintObject è la classe base per tutti PaintObjects utilizzabili (rettangolo, cerchio, triangolo, ecc.)
  • Il SelectedObject (di tipo PaintObject) è determinato da un processo di selezione in un altro modulo Prism (Toolbox)

La domanda è: come faccio unità può testare il metodo OnMouseLeftButtonDown? Il problema è che si basa pesantemente su MouseEventArgs e io non so davvero un buon modo per prendere in giro MouseEventArgs / stub.

È stato utile?

Soluzione

Con un ulteriore livello di consumare ed emettere gli eventi del mouse. Poi si può stub / deridere che livello per il test di unità.

Altri suggerimenti

Sono stato in grado di utilizzare il sistema di WPF evento Routing per eseguire questo tipo di test di unità con una proprietà associata, e presumo che funzionerà lo stesso con tutti gli altri discendenti di UIElement (Windows, ecc), perché il metodo .RaiseEvent () in questo frammento di codice viene fornito dalla classe 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());
  }

Non posso dire al 100% con certezza se questo si applica ai tipi di controllo specifico che hai elencato nella tua domanda, ma spero che questo frammento di codice sarà utile a qualcuno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top