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

3
我希望能够单元测试我正在编写的自定义集合,该集合需要订阅添加到集合中的对象的PropertyChanged事件,并在删除时取消订阅。如果添加到集合中的项目是接口,则问题不大,我可以使用Rhino Mocks进行模拟并Expect订阅。但在某些情况下,添加的项目是实际类,我无法模拟事件,因为它们不是虚拟的。是否有其他方法可以测试这些类是否正确地订阅和取消订阅了它们的PropertyChanged事件?
1个回答

3
在不使用模拟对象的情况下,你可以简单地向具体类型添加一个属性,以告诉你事件是否已经订阅。这只是一个建议。这可能与整体设计和/或使用模拟接口的其他单元测试不一致。
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多个模型类添加额外的代码。我不想为了方便单元测试而做出这样的修改。 - CodingGorilla
哎呀!是的,我想可能存在一些更深层次的问题;并且我完全同意不要仅仅为了方便单元测试而添加代码的观点。我自己也不会这样做。这只是我能想到的一种方法。 - harlam357

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接