Question

Je travaille actuellement sur un projet de la mine, qui est une application WPF MSPaint semblable. Cependant, je ne peins pas avec des outils de crayon ou quelque chose de similaire, mais avec des objets (rectangle, cercle, triangle, etc.). J'utilise Prism et le modèle MVVM pour atteindre testabilité et maintenabilité.

Je n'ai plus maintenant un problème. J'ai un CanvasView.xaml qui est (comme son nom l'indique) la toile je peins sur. Je l'ai mis en œuvre sur mesure Prisme CommandBehaviors (ie. MouseDownCommandBehavior) pour fournir un moyen de lier les commandes du ViewModel aux actions de la souris sur la toile.

La configuration de base ressemble à ceci:

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

Certaines choses ne sont pas présents dans le code:

  • PaintObjects est une collection d'objets PaintObject que ItemsControl sur la vue se lie à
  • PaintObject est la classe de base pour tous les PaintObjects utilisables (rectangle, cercle, triangle, etc.)
  • Le selectedObject (de type PaintObject) est déterminée par un processus de sélection dans un autre module Prism (boîte à outils)

La question est de savoir comment l'unité peut-je tester la méthode OnMouseLeftButtonDown? Le problème est qu'il repose en grande partie sur MouseEventArgs et je ne sais pas vraiment une bonne façon de se moquer / MouseEventArgs stub.

Était-ce utile?

La solution

Utiliser une couche supplémentaire à consommer et à émettre des événements de souris. Ensuite, vous pouvez stub / moquez que couche pour vos tests unitaires.

Autres conseils

Je suis en mesure d'utiliser le système de routage d'événements WPF pour effectuer ce type de tests unitaires avec une propriété attachée, et je suppose que cela fonctionnera même avec d'autres descendants de UIElement (Windows, etc.), parce que le procédé .RaiseEvent () dans cet extrait de code est fourni par la 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());
  }

Je ne peux pas dire à 100% pour certains si cela s'appliquera aux types spécifiques de contrôle que vous avez énumérés dans votre question, mais nous espérons que cet extrait sera utile à quelqu'un.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top