Pregunta

Actualmente estoy trabajando en un proyecto mío que es una aplicación MSPaint-como WPF. Sin embargo, yo no pinto con herramientas lápiz o algo similar, pero con objetos (rectángulo, círculo, triángulo, etc.). Utilizo Prism y el modelo MVVM para lograr la capacidad de prueba y mantenimiento.

Ahora he encontrado con un problema. Tengo un CanvasView.xaml que es (como su nombre indica) el lienzo estoy pintando sucesivamente. He implementado encargo Prisma CommandBehaviors (es decir. MouseDownCommandBehavior) para proporcionar una manera de obligar a las órdenes del modelo de vista de las acciones del ratón sobre el lienzo.

La configuración básica es el siguiente:

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

Algunas cosas que no están presentes en el código:

  • PaintObjects es una colección de objetos que PaintObject un ItemsControl en la vista se une a
  • PaintObject es la clase base para todos los PaintObjects utilizables (rectángulo, círculo, triángulo etc.)
  • El SelectedObject (de tipo PaintObject) se determina mediante un proceso de selección en otro módulo Prism (Toolbox)

La pregunta es ¿cómo puedo unidad de probar el método OnMouseLeftButtonDown? El problema es que en gran medida se basa en MouseEventArgs y no se sabe muy bien una buena manera de burlarse MouseEventArgs / stub.

¿Fue útil?

Solución

Utilice una capa adicional para consumir y emitir eventos de ratón. A continuación, puede ramal / burlan a cabo esa capa para sus pruebas de unidad.

Otros consejos

He sido capaz de utilizar el sistema de enrutamiento de eventos de WPF para realizar este tipo de pruebas unitarias con una propiedad adjunta, y supongo que va a trabajar el mismo con cualquier otro descendientes de UIElement (Windows, etc.), porque el método .RaiseEvent () en este fragmento de código es proporcionado por la clase 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());
  }

No puedo decir 100% con certeza si esto se aplicará a los tipos específicos de control que ha enumerado en su pregunta, pero esperemos que este fragmento será de utilidad a alguien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top