[英]How can I setup a moq mock to raise an event defined in an implementation of the interface and not the interface itself?
[英]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.