Функции модульного тестирования, использующие MouseEventArgs?

В настоящее время я работаю над моим проектом, который представляет собой приложение WPF, подобное MSPaint. Однако я рисую не карандашом или чем-то подобным, а объектами (прямоугольник, круг, треугольник и т. д.). Я использую Prism и модель MVVM для обеспечения тестируемости и удобства обслуживания.

Я сейчас столкнулся с проблемой. У меня есть CanvasView.xaml, который (как следует из названия) представляет собой холст, на котором я рисую. Я реализовал настраиваемые Prism CommandBehaviors (например, MouseDownCommandBehavior), чтобы обеспечить способ привязки команд ViewModel к действиям мыши на холсте.

Базовая установка выглядит так:

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

Некоторые вещи, которых нет в коде:

  • PaintObjects — это коллекция объектов PaintObject, к которым привязывается ItemsControl в представлении.
  • PaintObject — это базовый класс для всех используемых PaintObjects (прямоугольник, круг, треугольник и т. д.).
  • SelectedObject (типа PaintObject) определяется процессом выбора в другом модуле Prism (Toolbox).

Вопрос в том, как я могу протестировать метод OnMouseLeftButtonDown? Проблема в том, что он в значительной степени зависит от MouseEventArgs, и я действительно не знаю хорошего способа смоделировать/заглушить MouseEventArgs.


person chrischu    schedule 13.08.2009    source источник


Ответы (2)


Используйте дополнительный слой для приема и отправки событий мыши. Затем вы можете заглушить/изобразить этот слой для своих модульных тестов.

person Ates Goral    schedule 13.08.2009
comment
Не могли бы вы привести пример для этого? - person chrischu; 13.08.2009

Я смог использовать систему маршрутизации событий WPF для выполнения этого типа модульного тестирования с прикрепленным свойством, и я предполагаю, что он будет работать так же с любыми другими потомками UIElement (Windows и т. д.), потому что .RaiseEvent () в этом фрагменте кода предоставляется классом 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());
  }

Я не могу сказать на 100% наверняка, будет ли это применяться к конкретным типам элементов управления, которые вы указали в своем вопросе, но, надеюсь, этот фрагмент будет кому-то полезен.

person Community    schedule 27.06.2013