2011-05-16 4 views
28

Tengo una clase de presentador, que adjunta un evento de la vista inyectada. Ahora me gustaría probar al presentador reaccionando correctamente en el evento.Moq - simulacro.Raise debe levantar el evento en la unidad probada sin tener una configuración

Este es el IView interfaz de vista:

public interface IView 
{ 
    event EventHandler MyEvent; 
    void UpdateView(string test); 
} 

Esta ist la vista implementar IView

public partial class MyView : IView 
{ 
    public event EventHandler MyEvent; 

    public MyView() 
    { 
     this.combo.SelectedIndexChanged += this.OnSelectedIndexChanged; 
    } 

    public void UpdateView(string test) 
    { 
     this.textBox.Text = test; 
    } 

    private OnSelectedIndexChanged(Object sender, EventArgs e) 
    { 
     if (this.MyEvent != null) 
     { 
      this.MyEvent(sender, e); 
     } 
    } 
} 

Esta ist el presentador bajo prueba:

public class MyPresenter 
{ 
    private IView _view; 
    public MyPresenter(IView view) 
    { 
     this._view = view; 
     this._view.MyEvent += this.OnMyEvent; 
    } 

    private void OnMyEvent(Object sender, EventArgs e) 
    { 
     this._view.UpdateView(); 
    } 
} 

Este es el accesorio de prueba probando MyPresenter:

[TestClass] 
public class MyPresenterFixture() 
{ 
    private MyPresenter testee; 
    private Mock<IView> mockView; 

    [TestMethod] 
    public void ShouldReactOnMyEvent() 
    { 
     // arrange 
     this.mockView = new Mock<IView>(MockBehavior.Strict); 
     this.testee = new MyPresenter(this.mockView.Object); 

     // act 
     this.mockView.Raise(mock => mock.MyEvent += null); // this does not fire 

     // assert and verify 
     this.mockView.Verify(mock => mock.UpdateView(It.IsAny<string>()); 
    } 
} 

Estoy usando Moq 4. ¿Es posible hacer lo que quiero?

Saludos Yannik

Respuesta

57

¿usted no necesita pasar el argumento? La firma de su evento es EvenHandler, que es
(object sender, EventArgs e).

this.mockView.Raise(mock => mock.MyEvent += null, new EventArgs()); 

Nunca he usado la sobrecarga que ha especificado aquí ... aunque no parece correcta.

+2

+1. O pase en EventArgs.Empty. Debe pasar cualquier parámetro aparte del remitente como argumentos para Mock.Raise. Enlaces http://madcoderspeak.blogspot.com/2010/01/meet-frameworks-rhino-v-moq-v-jmock.html#scen8 http://code.google.com/p/moq/wiki/QuickStart – Gishu

3

Usted ha declarado UpdateView() como la aceptación de una cadena, pero su invocación presentador no tener un argumento de cadena (o por defecto):

Invocación:

private void OnMyEvent(Object sender, EventArgs e) 
{ 
    this._view.UpdateView(); 
} 

Declaración:

public void UpdateView(string test) 
{ 
    this.textBox.Text = test; 
} 

Ver ficación:

mockView.Verify(mock => mock.UpdateView(It.IsAny<string>()); 

Fwiw, creo que el evento en su punto de vista es un poco engorroso, un cambio simple sería:

public interface IView 
{ 
    void UpdateText(string test); 
} 

public class MyPresenter 
{ 
    private readonly IView _view; 
    public MyPresenter(IView view) 
    { 
     _view = view; 
    } 

    private void SelectItem(string item) 
    { 
     _view.UpdateText(item); 
    } 
} 

public partial class MyView : IView 
{ 
    private readonly MyPresenter _presenter; 

    public MyView() 
    { 
     _presenter = new MyPresenter(this); 
     combo.SelectedIndexChanged += OnSelectedIndexChanged; 
    } 

    public void UpdateText(string test) 
    { 
     textBox.Text = test; 
    } 

    private OnSelectedIndexChanged(Object sender, EventArgs e) 
    { 
     _presenter.SelectItem(combo.SelectedItem); 
    } 
} 

A continuación, sólo se podía comprobar la interacción con la vista sin tener una evento adicional para hacer frente a:

presenter.SelectItem("Burrito!"); 

    mockView.Verify(mock => mock.UpdateView("Burrito!"); 
+0

Hola Ritch, gracias por tu comentario. He visto que en el método de presentadores private void OnMyEvent (Object remitente, EventArgs e) {this._view.UpdateView(); } la entrada para UpdateView falta. Lamentablemente, su enfoque no nos funciona, porque implementamos la vista pasiva pura y la vista nunca conoce a su presentador. Cheers – Yannik

+1

Esta es una vista pasiva. –

Cuestiones relacionadas