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

时间:2008-09-24 16:07:21

标签: .net winforms unit-testing model-view-controller mocking

是否有人能够成功地将测试方法单元化,这些方法必然会与System.Windows.Forms.Form类耦合?

我最近一直在研究C#winforms应用程序,尝试使用MVC结构构建它。考虑到框架并非真正考虑到这一点,这很困难。

但是,当您将单元测试投入混音时,它会变得更加困难。我一直在确保我的控制器没有耦合到具体的视图类,因此我可以使用存根/模拟进行单元测试。但是引用Form类某处是不可避免的,这些方法确实需要进行测试。

我一直在使用Moq,因为它有一些不错的类型安全功能,并允许模拟具体类型。但不幸的是,它不允许我“期望”调用具体类型的方法或属性,既不是虚拟也不是抽象。由于Form类不是以子类化为基础构建的,因此这是一个大问题。我需要能够通过“期待”ShowDialog来模拟Form类以防止创建真正的窗口。

所以我无法运行任何与Form的子类进行大量交互的单元测试,我的观点是。

有没有人成功测试过这种类型的代码?你是怎么做到的?

这是其他模拟框架可以解决的问题吗?其他模拟框架使用的基于字符串的方法是否会受到相同的约束?我可以编写自己的显式长手模拟类,还是缺少虚拟成员会阻止我以这种方式抑制窗口行为?

或者是否有某种方式我没有想到构建我的类,以便表单耦合的代码最终在微不足道的复杂的方法和类中,这样我就可以在没有明确单元测试的情况下离开,没有我的良心打败了我?

2 个答案:

答案 0 :(得分:3)

我听说/用于GUI元素单元测试的最佳方法是Humble Dialog模式/方法。从本质上讲,表单只是界面,所有实际工作都在其他类中完成。您可以对提供功能的类进行单元测试,然后将GUI事件与这些类中的相应方法联系起来。

答案 1 :(得分:0)

我目前的想法是,我可能必须使用组合而不是继承与Form类,以将控制器与它分离。

这样做的缺点是每次我需要使用我没有计划的Form类的成员时,我需要将它显式添加到我的视图界面。