Unit testing 如何对事件订阅进行单元测试

Unit testing 如何对事件订阅进行单元测试,unit-testing,events,c#-4.0,rhino-mocks,Unit Testing,Events,C# 4.0,Rhino Mocks,我希望能够对我正在编写的自定义集合进行单元测试,该集合需要订阅添加到集合中的对象的PropertyChanged事件。然后在活动被删除时取消订阅 当添加到集合中的项目是一个接口时,这并不是什么大问题,我可以模拟它(使用Rhino mock)和Expect订阅。但在一个实例中,添加的项目是实际的类,我不能模拟这些事件,因为它们不是虚拟的 有没有其他方法可以测试这些类是否正确订阅和取消订阅了属性更改的事件?除了使用模拟,您可以简单地向具体类型添加一个属性,告诉您该事件是否有订阅?只是一个建议。这可能

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

当添加到集合中的项目是一个接口时,这并不是什么大问题,我可以模拟它(使用Rhino mock)和
Expect
订阅。但在一个实例中,添加的项目是实际的类,我不能模拟这些事件,因为它们不是虚拟的


有没有其他方法可以测试这些类是否正确订阅和取消订阅了
属性更改的
事件?

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

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多个模型类添加额外的代码。我不喜欢这样做只是为了方便单元测试。哎哟!是的,我想这里可能有更深层次的问题;我完全同意不只是为了方便单元测试而添加代码的观点。我可能也不会这么做。这只是我能想到的一种方法。