funções de teste de unidade depender de MouseEventArgs?
-
13-09-2019 - |
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.
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.