Moq - mock.Raise should raise event in tested unit without having a Setup

You've declared UpdateView() as accepting a string, but your presenter invocation does not have a string argument (or default):

Invocation:

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

Declaration:

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

Verification:

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

FWIW, I think the event in your view is a bit cumbersome, a simple change would be to:

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);
    }
}

Then you could just verify the interaction with the view without having an additional event to deal with:

    presenter.SelectItem("Burrito!");

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

Don't you need to pass the argument? Your event signature is EventHandler, which is
(object sender, EventArgs e).

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

I've never used the overload you've specified here... it doesn't seem correct, though.

Tags:

C#

Tdd

Mvp

Events

Moq