2010-11-08 9 views
25

¿Cómo puedo generar un evento a partir de un simulacro/apéndice usando Rhino Mocks?Recaudación de eventos de un simulador/apéndice utilizando Rhino Mocks

He encontrado algunas respuestas a esta pregunta en la web, pero todas parecen usar la sintaxis Record/Replay, pero estoy usando la sintaxis Arrange/Act/Assert.

¿Alguna sugerencia?

Un pequeño ejemplo ...

Digamos que estoy usando el patrón MVVM y tener esta clase de modelo:

public class MyModel 
{ 
    private int _myValue; 

    public event EventHandler ValueChanged; 

    public void SetValue(int newValue) 
    { 
     _myValue = newValue; 
     if (ValueChanged != null) 
     { 
      ValueChanged(this, null); 
     } 
    } 
} 

Como se puede ver la clase tiene un valor entero y un método que lo establece. Cuando se establece el valor, se genera un evento ValueChanged.

clase Este modelo es utilizado por un modelo de vista:

public class MyViewModel 
{ 
    private MyModel _myModel; 

    public MyViewModel(MyModel myModel) 
    { 
     _myModel = myModel; 
     _myModel.ValueChanged += ValueChangedHandler; 
    } 

    private void ValueChangedHandler(object sender, EventArgs e) 
    { 
     MyString = "Value has changed"; 
    } 

    public string MyString { get; set; } 
} 

Este modelo de vista escuchar al evento ValueChanged en el modelo y las actualizaciones cuando se levanta.

Ahora quiero probar que el modelo de vista se actualiza cuando el modelo genera el evento.

[TestMethod] 
public void MyViewModel_ModelRaisesValueChangedEvent_MyStringIsUpdated() 
{ 
    //Arrange. 
    var modelStub = MockRepository.GenerateStub<MyModel>(); 
    MyViewModel viewModel = new MyViewModel(modelStub); 

    //Act 
    -HERE I WANT TO RAISE THE VALUE CHANGED EVENT FROM modelStub. 

    //Assert. 
    Assert.AreEqual("Value has changed", viewModel.MyString); 
} 

Tenga en cuenta que esto es sólo un ejemplo y no mi código real (que es más complejo). Espero que puedas ignorar cualquier error tipográfico y otros pequeños errores.

Respuesta

32
[TestMethod] 
public void MyViewModel_ModelRaisesValueChangedEvent_MyStringIsUpdated() 
{ 
    //Arrange. 
    var modelStub = MockRepository.GenerateStub<IModel>(); 
    MyViewModel viewModel = new MyViewModel(modelStub); 

    //Act 
    modelStub.Raise(
     x => x.ValueChanged += null, 
     modelStub, // sender 
     EventArgs.Empty); 

    //Assert. 
    Assert.AreEqual("Value has changed", viewModel.MyString); 
} 

Editar: El error está encontrando probablemente puede resolverse cambiando el tipo de empalme hacia una interfaz IModel (que es como funcionan mis propias pruebas). He cambiado en el ejemplo anterior, pero también tendrá que cambiar la declaración MyViewModel constructor para tomar el tipo de interfaz.

Añadiendo la palabra clave virtual a la declaración evento también puede funcionar.

Cuestiones relacionadas