2009-03-11 3 views
5

Ich habe an einer WPF-Anwendung gearbeitet und ich verwende das ModelViewViewModel-Entwurfsmuster. Ich habe eine Reihe von Ereignissen, die aus der Ansicht herauskommen und zu ViewModel-Aktivitäten führen.WPF MVVM und Unit Testing

Was ist der vernünftige Weg, um diese Ereignisse von einem UnitTest ausgelöst zu bekommen? Zum Beispiel möchte ich das Drop-Ereignis simulieren. Ich möchte nicht wirklich eine Stub-View erstellen, nur um das Ereignis zu erhöhen.

Alle Vorschläge willkommen.

Danke.

Antwort

1

Es klingt, als ob Sie einen Event-Handler für das Drop-Ereignis direkt in Ihrer ViewModel-Klasse haben. Wäre es sinnvoller, den Handler in Ihrem UI-Layer zu haben, der wiederum eine Funktion in Ihrem ViewModel aufruft? Auf diese Weise könnte der Komponententest nur die Funktion aufrufen (Simulation einer Drag & Drop-Operation, soweit das ViewModel betroffen ist).

Plus, es würde besser Ihr ViewModel von Ihrem UI-Code trennen.

16

Nach dem MVVM Muster:

  • Der Blick über die Viewmodel weiß - es wird einen Verweis auf sie entweder als eine konkrete Instanz oder eine Schnittstelle
  • Das Ansichtsmodell sollte nicht über die Aussicht wissen bei alle.

Wenn Sie Ereignisse behandeln müssen, dann gibt es zwei Möglichkeiten, die ich kenne, es zu tun:

1:   Expose einen Befehl in Ihrem Viewmodel, und verwenden Sie die Datenbindung es auszulösen. Dies ist meine bevorzugte Art und Weise, zum Beispiel:

class MyViewModel 
{ 
    public ICommand ClickCommand { get; set; } 
} 

<Button Command="{Binding Path=ClickCommand}" /> 

Wenn Sie dies tun, dann können Sie den Befehl testen, indem Sie einfach myViewModel.ClickCommand.Execute manuell aufrufen.

2:   eine Funktion in der Viewmodel Expose, und schreiben Sie die absolute Minimum in der .xaml.cs Datei das Ereignis zu behandeln und die Funktion aufrufen, zB:

class MyViewModel 
{ 
    public void HandleClick(){ } 
} 

<Button Click="MyClickHandler"> 

//.xaml.cs file 
public void MyClickHandler(Object sender, EventArgs e) { 
    m_viewModel.HandleClick() 
} 

Wenn Sie dies tun, Dann können Sie testen, indem Sie einfach myViewModel.HandleClick manuell aufrufen. Sie sollten sich nicht darum kümmern, dass der MyClickHandler-Code getestet wird, da es nur eine Zeile ist!

0

Rufen Sie kein Ereignis auf, rufen Sie nur die Handler auf (was bedeutet, dass sie öffentlich sein sollten und wahrscheinlich weniger zentrifugale Argumente für Event-Handler verwenden). Überprüfen Sie, wie dies in Caliburn (http://www.codeplex.com/caliburn) mit "Aktionen" getan wird.