Pergunta

Atualmente, estou trabalhando em um projeto de minha que é um aplicativo Paint-como WPF. No entanto eu não pintar com lápis ferramentas ou algo semelhante, mas com objetos (retângulo, círculo, triângulo, etc.). Eu uso Prism eo modelo MVVM para alcançar a capacidade de teste e manutenção.

Eu já executado em um problema. Eu tenho um CanvasView.xaml desse (como o nome sugere) a tela estou pintando por diante. Eu tenho implementado costume Prism CommandBehaviors (ie. MouseDownCommandBehavior) para fornecer uma maneira de vincular os comandos do ViewModel para as ações do mouse na tela.

Os olhares de configuração básica como este:

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

Algumas coisas não presentes no código:

  • PaintObjects é uma coleção de PaintObject objetos que uma ItemsControl no Ver se liga a
  • PaintObject é a classe base para todos os PaintObjects utilizáveis ??(Retângulo, Círculo, Triângulo etc.)
  • A SelectedObject (de tipo PaintObject) é determinada por um processo de selecção de um outro módulo de prisma (Toolbox)

A questão é como posso unidade testar o método OnMouseLeftButtonDown? O problema é que ele depende fortemente MouseEventArgs e eu realmente não sei uma boa maneira de MouseEventArgs / stub simulados.

Foi útil?

Solução

Use uma camada adicional para consumir e eventos do mouse emitem. Então você pode stub / zombar fora essa camada para os testes de unidade.

Outras dicas

Eu tenho sido capaz de usar o sistema WPF Routing Evento para realizar este tipo de teste de unidade com uma propriedade anexada, e eu suponho que ele vai trabalhar o mesmo com quaisquer outros descendentes de UIElement (Windows, etc.), porque o método .RaiseEvent () neste trecho de código é fornecido pela 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());
  }

Eu não posso dizer 100% ao certo se isso se aplica aos tipos de controlo específicos que você listou na sua pergunta, mas espero que esse trecho será útil para alguém.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top