gpt4 book ai didi

c# - 使用 Rhino Mocks 从模拟/ stub 中引发事件

转载 作者:IT王子 更新时间:2023-10-29 04:21:51 25 4
gpt4 key购买 nike

如何使用 Rhino Mocks 从模拟/ stub 引发事件?

我在网上找到了这个问题的一些答案,但他们似乎都使用 Record/Replay-syntax,但我使用的是 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 事件。

此模型类由 View 模型使用:

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

此 View 模型监听模型上的 ValueChanged 事件并在引发时更新。

现在我想测试当模型引发事件时 View 模型是否更新。

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

请注意,这只是一个示例,而不是我的实际代码(更复杂)。希望您能无视任何拼写错误和其他小错误。

最佳答案

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

编辑: 您遇到的错误可能可以通过将 stub 类型更改为接口(interface) IModel 来解决(这就是我自己的测试的工作方式)。我在上面的示例中对其进行了更改,但您还必须更改 MyViewModel 构造函数声明以采用接口(interface)类型。

在事件声明中添加 virtual 关键字也可能有效。

关于c# - 使用 Rhino Mocks 从模拟/ stub 中引发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4124054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com