如何为使用winforms视图的控制器类编写单元测试?

5
有人能够成功地对必须与System.Windows.Forms.Form类耦合的方法进行单元测试吗?
我最近一直在开发一个C# winforms应用程序,试图使用MVC结构构建它。这已经很困难了,因为该框架并不是为此而构建的。
然而,当你将单元测试加入到其中时,情况变得更加艰难。我一直在确保我的控制器不与具体的视图类耦合,以便我可以使用存根/模拟进行单元测试。但是,无法避免地在某个地方引用Form类,并且这些方法确实需要被测试。
我一直在使用Moq,因为它具有一些很好的类型安全功能,并允许模拟具体类型。但不幸的是,它不允许我“期望”调用既不是虚拟也不是抽象的具体类型上的方法或属性。由于Form类不是为子类化而构建的,这是一个大问题。我需要能够模拟Form类以防止创建真正的窗口,例如通过“期望”ShowDialog。

所以我无法运行任何与Form子类进行交互的单元测试,而我的视图就是这样。

有没有人成功地对这种类型的代码进行了单元测试?你是如何做到的?

其他mocking框架能够解决这个问题吗?其他mocking框架使用的基于字符串的方法是否会受到相同的限制?我可以编写自己的显式手工mock类吗,还是缺少虚成员将阻止我通过这种方式抑制窗口行为?

或者,我是否有一些方法来组织我的类,使得与Forms耦合的代码最终以微不足道的复杂度的方法和类的形式出现,这样我就可以不需要明确地对其进行单元测试,而我的良心也不会折磨我?

2个回答

3

我听说/使用过的最好的GUI元素单元测试方法是Humble Dialog模式/方法。本质上,表单只是接口,所有真正的工作都在其他类中完成。你可以对提供功能的类进行单元测试,然后只需将GUI事件与这些类中的适当方法绑定即可。


0

我目前的想法是,我可能需要使用组合而不是继承Form类,以将控制器与其解耦。

这样做的缺点是,每当我需要使用一个我没有计划使用的Form类成员时,我需要将其显式添加到我的视图接口中。


这并不一定是坏事,因为通过良好的规划,这种情况不应该经常发生。如果这是拥有可靠和经过充分测试的代码的代价,我认为这是一个低廉的代价。 - Sunny Milenov

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