【问题标题】:How to unit test event subscription如何对事件订阅进行单元测试
【发布时间】:2011-11-02 15:55:52
【问题描述】:

我希望能够对我正在编写的自定义集合进行单元测试,该集合需要订阅添加到集合中的对象的PropertyChanged 事件。然后在事件被删除时取消订阅。

当添加到集合中的项目是一个接口时,这没什么大不了的,我可以模拟它(使用 Rhino Mocks)和Expect 订阅。但在一种情况下,添加的项目是实际的类,我无法模拟这些事件,因为它们不是虚拟的。

还有其他方法可以测试这些类的PropertyChanged 事件是否正确订阅和取消订阅?

【问题讨论】:

    标签: unit-testing events c#-4.0 rhino-mocks


    【解决方案1】:

    您是否可以简单地向具体类型添加一个属性来代替使用模拟,该属性将告诉您事件是否有订阅?只是一个建议。这可能与整体设计和/或使用模拟接口的单元测试的其余部分不一致。

    class SomeClass : INotifyPropertyChanged
    {
       public bool PropertyChangedSubscribed
       {
          get { return PropertyChanged != null; }
       }
    
       public event PropertyChangedEventHandler PropertyChanged;
    }
    
    // unit test code
    var someClass = new SomeClass();
    Assert.IsFalse(otherClass.PropertyChangedSubscribed);
    someClass.PropertyChanged += SubscribedMethod;
    Assert.IsTrue(otherClass.PropertyChangedSubscribed);
    

    【讨论】:

    • 我考虑过这种方法,我的问题是其中一些类是使用基于“模型”类的 T4 模板生成的(我正在测试的类是视图模型的一部分)。所以我必须修改我的 T4 模板,这会将这段额外的代码添加到所有 140 多个模型类中。我讨厌做这样的事情只是为了方便单元测试。
    • 哎哟!是的,我认为这里可能存在一些更深层次的问题;我完全同意不要仅仅为了方便单元测试而添加代码的观点。我可能也不会这样做。这只是我能想到的一种方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多