gpt4 book ai didi

wpf - 依赖于 MouseEventArgs 的单元测试功能?

转载 作者:行者123 更新时间:2023-12-04 14:07:37 29 4
gpt4 key购买 nike

我目前正在开发我的一个项目,它是一个类似于 MSPaint 的 WPF 应用程序。但是,我不使用铅笔工具或类似的工具,而是使用对象(矩形、圆形、三角形等)进行绘画。我使用 Prism 和 MVVM 模型来实现可测试性和可维护性。

我现在遇到了一个问题。我有一个 CanvasView.xaml (顾名思义)我正在画的 Canvas 。我已经实现了自定义 Prism CommandBehaviors(即 MouseDownCommandBehavior),以提供一种将 ViewModel 的命令绑定(bind)到 Canvas 上的鼠标操作的方法。

基本设置如下所示:

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 是 View 上的 ItemsControl 绑定(bind)到
  • 的 PaintObject 对象的集合。
  • PaintObject 是所有可用 PaintObject(矩形、圆形、三角形等)的基类
  • SelectedObject(PaintObject 类型)由另一个 Prism 模块(工具箱)中的选择过程确定

  • 问题是如何对 OnMouseLeftButtonDown 方法进行单元测试?问题是它严重依赖于 MouseEventArgs,我真的不知道模拟/ stub MouseEventArgs 的好方法。

    最佳答案

    我已经能够使用 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% 确定这是否适用于您在问题中列出的特定控件类型,但希望此代码段对某人有所帮助。

    关于wpf - 依赖于 MouseEventArgs 的单元测试功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1272755/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com