2009-08-13 128 views
4

我目前正在開發一個類似MSPaint的WPF應用程序。但是我不會用鉛筆工具或類似的東西來繪畫,而是使用對象(矩形,圓形,三角形等)。我使用Prism和MVVM模型來實現可測試性和可維護性。依賴MouseEventArgs的單元測試函數?

我現在遇到了一個問題。我有一個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)被確定爲b y在另一個Prism模塊(工具箱)中的選擇過程

問題是如何單元測試OnMouseLeftButtonDown方法?問題在於它很大程度上依賴於MouseEventArgs,並且我不知道如何模擬/存根MouseEventArgs。

回答

2

使用額外的層消耗和發射鼠標事件。然後你可以在單元測試中對該圖層進行存根/模擬。

+0

你能提供一個例子嗎? – chrischu 2009-08-13 16:56:55

5

我已經能夠使用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%肯定這是否適用於你已經在你的問題中列出的具體的控制類型,但希望這段代碼對別人有幫助。