如何使用Rhino Mocks从模拟/存根中引发事件?
我在网上找到了这个问题的一些答案,但它们似乎都使用了Record / Replay语法,但我使用的是Arrange / Act / Assert语法。
有什么建议吗?
一个小例子......
假设我正在使用MVVM模式并拥有此模型类:
public class MyModel
{
private int _myValue;
public event EventHandler ValueChanged;
public void SetValue(int newValue)
{
_myValue = newValue;
if (ValueChanged != null)
{
ValueChanged(this, null);
}
}
}
正如您所看到的,该类有一个整数值和一个设置它的方法。设置该值后,将引发ValueChanged
事件。
此模型类由viewmodel使用:
public class MyViewModel
{
private MyModel _myModel;
public MyViewModel(MyModel myModel)
{
_myModel = myModel;
_myModel.ValueChanged += ValueChangedHandler;
}
private void ValueChangedHandler(object sender, EventArgs e)
{
MyString = "Value has changed";
}
public string MyString { get; set; }
}
此视图模型会侦听模型上的ValueChanged
事件,并在引发模型时进行更新。
现在我想测试一下模型引发事件时视图模型的更新。
[TestMethod]
public void MyViewModel_ModelRaisesValueChangedEvent_MyStringIsUpdated()
{
//Arrange.
var modelStub = MockRepository.GenerateStub<MyModel>();
MyViewModel viewModel = new MyViewModel(modelStub);
//Act
-HERE I WANT TO RAISE THE VALUE CHANGED EVENT FROM modelStub.
//Assert.
Assert.AreEqual("Value has changed", viewModel.MyString);
}
请注意,这只是一个示例,而不是我的实际代码(更复杂)。我希望你可以忽视任何拼写错误和其他小错误。
答案 0 :(得分:32)
[TestMethod]
public void MyViewModel_ModelRaisesValueChangedEvent_MyStringIsUpdated()
{
//Arrange.
var modelStub = MockRepository.GenerateStub<IModel>();
MyViewModel viewModel = new MyViewModel(modelStub);
//Act
modelStub.Raise(
x => x.ValueChanged += null,
modelStub, // sender
EventArgs.Empty);
//Assert.
Assert.AreEqual("Value has changed", viewModel.MyString);
}
编辑:您遇到的错误可能可以通过将存根类型更改为接口IModel
来解决(这就是我自己的测试工作方式)。我在上面的示例中对其进行了更改,但您还必须更改MyViewModel
构造函数声明以获取接口类型。
将virtual
关键字添加到事件声明中也可以。