2009-03-11 23 views
5

He estado trabajando en una aplicación WPF y estoy usando el patrón de diseño ModelViewViewModel. Tengo una serie de eventos que salen de la vista y que dan como resultado la actividad de ViewModel.WPF MVVM y Pruebas unitarias

¿Cuál es la forma razonable de obtener estos eventos desde un UnitTest? Por ejemplo, quiero simular el evento drop. Realmente no quiero construir una vista de código auxiliar, solo para plantear el evento.

Cualquier sugerencia bienvenida.

Gracias.

Respuesta

1

Parece que tiene un controlador de eventos para el evento de caída directamente en su clase de ViewModel. ¿Tendría más sentido tener el controlador en la capa de UI, que a su vez llamará a una función en su ViewModel? De esta forma, la prueba de su unidad podría simplemente llamar a la función (simulando una operación de arrastrar y soltar, en lo que respecta al modelo de vista).

Además, separaría mejor su ViewModel de su código de UI.

16

De acuerdo con el patrón MVVM:

  • The View sabe sobre el modelo de vista - que tendrá una referencia a él ya sea como un ejemplo concreto o una interfaz
  • El modelo de vista no debe saber acerca de la vista todas.

Si usted necesita para manejar eventos, entonces hay dos maneras que conozco de hacerlo:

1:   exponer un comando en el modelo de vista, y el uso de enlace de datos para desencadenarla. Esta es mi forma preferida, por ejemplo:

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

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

Si hace esto, entonces usted puede probar el comando simplemente llamando myViewModel.ClickCommand.Execute manualmente.

2:   exponer una función en el modelo de vista, y escribir el absoluta mínima en el archivo .xaml.cs para controlar el evento y llame a la función, por ejemplo:

class MyViewModel 
{ 
    public void HandleClick(){ } 
} 

<Button Click="MyClickHandler"> 

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

Si hace esto, entonces puede probar simplemente llamando al myViewModel.HandleClick manualmente. ¡No debería molestarse con probar el código de la unidad MyClickHandler ya que solo tiene 1 línea!

0

No provoques un evento, solo llama a los manejadores (lo que significa que deben ser públicos, y probablemente tomen menos argumentos centrados en el manejador de eventos). Vea cómo se hace esto en Caliburn (http://www.codeplex.com/caliburn) usando "Acciones".