문제

나는 현재 Mspaint와 같은 WPF 응용 프로그램 인 나의 프로젝트를 진행하고 있습니다. 그러나 나는 연필 도구 나 유사한 물건으로 페인트하지 않지만 물체 (사각형, 원, 삼각형 등)와 페인트합니다. 나는 프리즘과 MVVM 모델을 사용하여 테스트 가능성과 유지 가능성을 달성합니다.

이제 문제가 발생합니다. 나는 canvasview.xaml을 가지고 있습니다. 나는 Custom Prism CommandBehaviors (예 : MousedownCommandbehavior)를 구현하여 뷰 모델의 명령을 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이
  • PaintObject는 모든 사용 가능한 PaintObjects (사각형, 원, 삼각형 등)의 기본 클래스입니다.
  • selectedObject (유형 PaintObject)는 다른 프리즘 모듈 (Toolbox)의 선택 프로세스에 의해 결정됩니다.

문제는 onMouseleftButtondown 방법을 어떻게 단위 테스트 할 수 있습니까? 문제는 그것이 Mouseeventargs에 크게 의존하고 Mock/Stub Mouseeventargs를 조롱하는 좋은 방법을 모른다는 것입니다.

도움이 되었습니까?

해결책

추가 레이어를 사용하여 마우스 이벤트를 소비하고 방출하십시오. 그런 다음 장치 테스트를 위해 해당 레이어를 스텁/조롱 할 수 있습니다.

다른 팁

WPF 이벤트 라우팅 시스템을 사용하여 첨부 된 속성으로 이러한 유형의 단위 테스트를 수행 할 수 있었으며, .raiseevent이기 때문에 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