簡體   English   中英

Moq - mock.Raise 應該在沒有設置的情況下在測試單元中引發事件

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

我有一個演示者類,它附加了注入視圖的事件。 現在我想測試演示者對事件的正確反應。

這是視圖接口IView

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

這是實現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);
        }
    }
}

這是被測試的演示者:

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

這是測試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>());
    }
}

我正在使用 Moq 4。是否可以做我想做的事?

你不需要傳遞參數嗎? 您的事件簽名是EventHandler ,即
(object sender, EventArgs e)

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

我從未使用過您在此處指定的重載……不過,它似乎不正確。

您已將 UpdateView() 聲明為接受字符串,但您的演示者調用沒有字符串參數(或默認值):

調用:

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

宣言:

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

確認:

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

FWIW,我認為您認為的事件有點麻煩,一個簡單的更改是:

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

然后你可以只驗證與視圖的交互,而無需處理額外的事件:

    presenter.SelectItem("Burrito!");

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM