如何为使用Winforms查看的控制器类编写单元测试?
有没有人能够成功地将必要的方法耦合到System.Windows.Forms.Form类的单元测试方法?
我最近一直在研究Cwinforms应用程序,尝试使用MVC结构进行构建。鉴于该框架并不是真正考虑到这一点而构建的,因此这已经非常困难。
但是,当我们将单元测试放入组合中时,它将变得更加困难。我一直在确保我的控制器没有耦合到具体的视图类,以便可以使用存根/模拟进行单元测试。但是在某个地方引用Form类是不可避免的,并且这些方法的确需要进行测试。
我一直在使用Moq,因为它具有一些不错的类型安全性功能,并允许模拟具体类型。但是不幸的是,它不允许我"期待"对既不是虚拟的也不是抽象的具体类型的方法或者属性的调用。而且由于Form类并不是在考虑子类的基础上构建的,因此这是一个大问题。我需要能够模拟Form类,以防止通过例如"期望" ShowDialog来创建实际的窗口。
因此,我无法运行任何与Form的子类进行大量交互的单元测试,这些都是我的观点。
那里有人成功地对这种类型的代码进行了单元测试吗?你是怎么做到的?
这是其他模拟框架可以解决的吗?其他模拟框架使用的基于字符串的方法会受到相同的约束吗?我是否可以编写自己的显式长期模拟类,或者是否缺少虚拟成员,也会使我也无法以这种方式抑制窗口行为?
还是有某种我没有想到的方式来构造我的类,以使窗体耦合的代码最终陷入琐碎复杂的方法和类中,这样我就可以在没有明确的单元测试的情况下逃脱现实,而不用良心击败我为了它?
解决方案
我当前的想法是,我可能不得不对Form类使用组合而不是继承,以将控制器与其分离。
这样做的缺点是,每当我需要使用我不打算使用的Form类的成员时,都需要将其显式添加到我的视图界面中。
我听说过/用于GUI元素的单元测试的最佳方法是Humble Dialog模式/方法。本质上,表单只是接口,所有实际工作都在其他类中完成。我们可以对提供该功能的类进行单元测试,然后将GUI事件绑定到这些类中的相应方法。