我有一些引发 PropertyChanged
事件的代码,我希望能够对事件是否正确引发进行单元测试。
引发事件的代码如下
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
}
}
}
}
在我的单元测试中,我通过以下代码获得了一个不错的绿色测试,它使用了委托(delegate):
[TestMethod]
public void Test_ThatMyEventIsRaised()
{
string actual = null;
MyClass myClass = new MyClass();
myClass.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
actual = e.PropertyName;
};
myClass.MyProperty = "testing";
Assert.IsNotNull(actual);
Assert.AreEqual("MyProperty", actual);
}
但是,如果我尝试像这样将属性设置链接在一起:
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
MyOtherProperty = "SomeValue";
}
}
}
public string MyOtherProperty
{
set
{
if (_myOtherProperty != value)
{
_myOtherProperty = value;
NotifyPropertyChanged("MyOtherProperty");
}
}
}
我对事件的测试失败了 - 它捕获的事件是 MyOtherProperty 的事件。
我很确定事件会触发,我的 UI 会像它一样使用react,但我的委托(delegate)只捕获最后一个事件触发。
所以我想知道:
1、我测试事件的方法是否正确?
2. 我引发链式事件的方法是否正确?
最佳答案
您所做的一切都是正确的,前提是您希望测试询问“最后引发的事件是什么?”
您的代码按此顺序触发这两个事件
- 属性已更改(...“我的属性”...)
- 属性已更改(...“MyOtherProperty”...)
这是否“正确”取决于这些事件的目的。
如果您想测试引发事件的数量以及事件引发的顺序,您可以轻松扩展现有测试:
[TestMethod]
public void Test_ThatMyEventIsRaised()
{
List<string> receivedEvents = new List<string>();
MyClass myClass = new MyClass();
myClass.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
receivedEvents.Add(e.PropertyName);
};
myClass.MyProperty = "testing";
Assert.AreEqual(2, receivedEvents.Count);
Assert.AreEqual("MyProperty", receivedEvents[0]);
Assert.AreEqual("MyOtherProperty", receivedEvents[1]);
}
关于c# - 在 C# 中引发事件的单元测试(按顺序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/248989/