2009-03-11 20 views
5

Ho lavorato a un'applicazione WPF e sto utilizzando il modello di progettazione ModelViewViewModel. Ho un numero di eventi che vengono fuori dalla vista, che si traducono in attività ViewModel.WPF MVVM e Test unità

Qual è il modo risonabile per ottenere questi eventi generati da un test unitario? Ad esempio, voglio simulare l'evento di rilascio. Non voglio davvero costruire una visualizzazione stub, solo per sollevare l'evento.

Qualsiasi suggerimento benvenuto.

Grazie.

risposta

1

Sembra che tu abbia un gestore di eventi per l'evento di rilascio direttamente nella classe ViewModel. Avrebbe più senso avere il gestore nel tuo livello di interfaccia utente, che a sua volta chiamerà una funzione nel tuo ViewModel? In questo modo, il tuo test unitario potrebbe semplicemente chiamare la funzione (simulando un'operazione drag and drop, per quanto riguarda il ViewModel).

Inoltre, sarebbe meglio separare il tuo ViewModel dal tuo codice UI.

16

Secondo il modello MVVM:

  • The View sa circa il ViewModel - avrà un riferimento ad esso sia come un esempio concreto o un'interfaccia
  • Il ViewModel non dovrebbe sapere la vista a tutti.

Se è necessario per gestire gli eventi, poi ci sono due modi, che io conosco per farlo:

1:   esporre un comando nel ViewModel, e utilizzare l'associazione dati per innescare esso. Questo è il mio modo preferito, ad esempio:

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

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

Se si fa questo, allora si può provare il comando semplicemente chiamando myViewModel.ClickCommand.Execute manualmente.

2:   esporre una funzione nel ViewModel, e scrivere il assoluta minima nel file .xaml.cs per gestire l'evento e chiamare la funzione, ad esempio:

class MyViewModel 
{ 
    public void HandleClick(){ } 
} 

<Button Click="MyClickHandler"> 

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

Se si esegue questa operazione, quindi puoi provare semplicemente chiamando myViewModel.HandleClick manualmente. Non dovresti preoccuparti di testare il codice dato che è solo una linea!

0

Non generare un evento, basta chiamare i gestori (il che significa che devono essere pubblici e probabilmente richiedono meno argomenti centrati sul gestore di eventi). Guarda come è fatto a Caliburn (http://www.codeplex.com/caliburn) usando "Azioni".