2009-03-12 9 views
1

Ich versuche einen Komponententest aufzubauen und möchte ein DropEvent vortäuschen.WPF Unit Test, UIElement.RaiseEvent, ArgumentException

Ich erhalte einen Fehler, da versucht wird, das Ereignis auszulösen. Ich kann keine DragEventArgs erstellen, wenn der Schutzlevel intern ist.

System.ArgumentException : Object of type 'System.Windows.RoutedEventArgs' cannot be converted to type 'System.Windows.DragEventArgs' 

ich folgendes haben ...

 [Test] 
    public void Test() 
    { 
     DesignerMock view = new DesignerMock(); 
     _viewModel = (PanelDesignViewModel)view.DataContext; 
     view.Show(); 

     Assert.IsNotNull(_viewModel); 

     RoutedEventArgs args = new RoutedEventArgs(DesignerCanvas.DropEvent,view.DesignerCanvas) ; 
     view.DesignerCanvas.RaiseEvent(args); 

     view.Close(); 

    } 

Antwort

0

Wenn Sie unnachgiebig sind, dass Sie Ihren Code auf diese Weise testen möchten, können Sie Reflexionen verwenden, um eine DragEventArgs zu erstellen. Die eigentliche Frage ist jedoch, denke ich, wenn Sie mit Ihrem Komponententest in die richtige Richtung gehen. Normalerweise vermeide ich Tests direkt auf meinen Views und halte mich daran, die einfach testbaren Viewmodels zu testen (wenn du tatsächlich MVVM verwendest), weil du genau das Problem hast, das du gerade hast.

+0

Nicht hartnäckig, nur hoffnungsvoll. Ich versuche das ViewModel zu testen, aber es reagiert auf Ereignisse. Ich kann das Ereignis umgestalten, aber ich habe immer noch einige VisualTreeHelper-Sachen, die immer noch eine Mock-Ansicht benötigen, um damit zu arbeiten. Vielen Dank. – jeff

+0

Wenn Ihr ViewModel direkt auf UI-Ereignisse reagiert, stimmt etwas nicht mit Ihrem Design ... Sie haben wahrscheinlich ein entscheidendes Prinzip von MVVM missverstanden, das besagt, dass das ViewModel unabhängig von der Benutzeroberfläche ist –

1

Wie ascalonx sagt, sollten Sie Ihre View nicht testen, nur Ihr ViewModel. Dies bedeutet, dass Ihr ViewModel von der View abgekoppelt werden muss. Stellen Sie anstelle eines Ereignishandlers eine einfache öffentliche Methode im ViewModel zur Verfügung, die die von Ihnen benötigte Arbeit erledigt, und rufen Sie diese einfach in Ihrem Test auf. Verwenden Sie ein angehängtes Verhalten, um Ihre View diese Methode aufzurufen. Caliburn hat ein nettes "Aktionen" Verhalten, um genau dies zu tun.

Sie erwähnen, Sie haben auch einige VisualTreeHelper Zeug "weiter". Dies ist eine Verletzung des M-V-VM-Musters, da es Ihre VM an eine bestimmte V-Implementierung koppelt. Was auch immer Sie dort tun, abstrahieren Sie es zu einer "Service" -Schnittstelle und verwenden Sie IoC oder Service Locator, um diesen Service für Ihre VM bereitzustellen. Ich könnte vorschlagen, dafür Onyx zu betrachten (Disclaimer: Ich bin der Autor dieser Bibliothek). Es bietet einen flexiblen und einfach zu verwendenden Mechanismus zur Bereitstellung von Diensten für Ihre VM.