c# - 在 C# 中引发事件的单元测试(按顺序)

标签 c# unit-testing events

我有一些引发 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/

相关文章:

c# - 像这样的语法在 C# 中意味着什么?

c# - DAL 和 BLL 命名约定其他人的替代方案

unit-testing - 将 Rewire 与 TypeScript 结合使用

c# - 从 ini/xml 文件加载设置

c# - 更改访问修饰符解决方法

unit-testing - 如何使用 pub run test 运行特定的 Dart _test 文件?

ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象

jquery - 如何在原型(prototype)中按类选择事件

asp.net - 高级: How many times does HttpModule Init() method get called during application's life?

java - 使用 addActionListener() 的 ActionPerformed 和 Netbeans 生成的 ActionPerformed 之间有什么区别?