سؤال

أنا أعمل حاليا على مشروع لي وهو تطبيق WPF يشبه mspaint. ومع ذلك، أنا لا أرسم مع أدوات قلم رصاص أو شيء مشابه ولكن مع كائنات (مستطيل، دائرة، مثلث، إلخ). أستخدم المنشور ونموذج MVVM لتحقيق الاستقرار والصيانة.

لقد واجهت الآن مشكلة. لدي canvasview.xaml هذا (كما يوحي الاسم) القماش الذي أرسم عليه. لقد قمت بتنفيذ CommandBehaviors مخصص Prism (أي 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 التي تحتوي على bindcontrol على الرأي
  • Paintobject هي الفئة الأساسية لجميع اللوحات القابلة للاستخدام (المستطيل، دائرة، مثلث، إلخ)
  • يتم تحديد SearseObject (من النوع PaintoBject) بواسطة عملية اختيار في وحدة PRISM أخرى (Toolbox)

السؤال هو كيف يمكنني اختبار الوحدة طريقة OnmouseleftButondondown؟ المشكلة هي أنه يعتمد بشدة على mouseventargs وأنا لا أعرف حقا طريقة جيدة لسخر / كعب mouseventargs.

هل كانت مفيدة؟

المحلول

استخدم طبقة إضافية لاستهلاك وأحداث الماوس. ثم يمكنك كعب / وهمية هذه الطبقة لاختبارات الوحدة الخاصة بك.

نصائح أخرى

تمكنت من استخدام نظام توجيه الأحداث WPF لتنفيذ هذا النوع من اختبار الوحدة بميزة مرفقة، وأفترض أنه سيعمل نفسه مع أي أحفاد أخرى من Uielement (Windows، إلخ)، لأن. () يتم توفير الطريقة في مقتطف الكود بواسطة فئة 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٪ للتأكد من أنه سيتقدم ذلك إلى أنواع التحكم المحددة التي أدرجتها في سؤالك، ولكن نأمل أن يكون هذا المقتطف مفيدا لشخص ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top