有人能够成功地对必须与System.Windows.Forms.Form类耦合的方法进行单元测试吗?
我最近一直在开发一个C# winforms应用程序,试图使用MVC结构构建它。这已经很困难了,因为该框架并不是为此而构建的。
然而,当你将单元测试加入到其中时,情况变得更加艰难。我一直在确保我的控制器不与具体的视图类耦合,以便我可以使用存根/模拟进行单元测试。但是,无法避免地在某个地方引用Form类,并且这些方法确实需要被测试。
我一直在使用Moq,因为它具有一些很好的类型安全功能,并允许模拟具体类型。但不幸的是,它不允许我“期望”调用既不是虚拟也不是抽象的具体类型上的方法或属性。由于Form类不是为子类化而构建的,这是一个大问题。我需要能够模拟Form类以防止创建真正的窗口,例如通过“期望”ShowDialog。
我最近一直在开发一个C# winforms应用程序,试图使用MVC结构构建它。这已经很困难了,因为该框架并不是为此而构建的。
然而,当你将单元测试加入到其中时,情况变得更加艰难。我一直在确保我的控制器不与具体的视图类耦合,以便我可以使用存根/模拟进行单元测试。但是,无法避免地在某个地方引用Form类,并且这些方法确实需要被测试。
我一直在使用Moq,因为它具有一些很好的类型安全功能,并允许模拟具体类型。但不幸的是,它不允许我“期望”调用既不是虚拟也不是抽象的具体类型上的方法或属性。由于Form类不是为子类化而构建的,这是一个大问题。我需要能够模拟Form类以防止创建真正的窗口,例如通过“期望”ShowDialog。
所以我无法运行任何与Form子类进行交互的单元测试,而我的视图就是这样。
有没有人成功地对这种类型的代码进行了单元测试?你是如何做到的?
其他mocking框架能够解决这个问题吗?其他mocking框架使用的基于字符串的方法是否会受到相同的限制?我可以编写自己的显式手工mock类吗,还是缺少虚成员将阻止我通过这种方式抑制窗口行为?
或者,我是否有一些方法来组织我的类,使得与Forms耦合的代码最终以微不足道的复杂度的方法和类的形式出现,这样我就可以不需要明确地对其进行单元测试,而我的良心也不会折磨我?