Moq – mock.Raise应该在没有安装程序的情况下在测试单元中引发事件

我有一个演示者类,它附加了注入视图的事件。 现在我想测试演示者对事件的正确反应。

这是视图界面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 mockView; [TestMethod] public void ShouldReactOnMyEvent() { // arrange this.mockView = new Mock(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()); } } 

我正在使用Moq 4.我可以做我想做的事吗?

最好的问候Yannik

你不需要通过论证吗? 您的事件签名是EvenHandler,即
(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; } 

validation:

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

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

然后,您可以只validation与视图的交互,而无需处理其他事件:

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