5

有没有人能够成功地对必须耦合到 System.Windows.Forms.Form 类的方法进行单元测试?

我最近一直在开发 C# winforms 应用程序,尝试使用 MVC 结构构建它。这已经够难了,因为框架并没有真正考虑到这一点。

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

我一直在使用Moq,因为它有一些很好的类型安全特性,并且允许模拟具体类型。但不幸的是,它不允许我“期望”调用既不是虚拟也不是抽象的具体类型的方法或属性。而且由于 Form 类在构建时没有考虑到子类化,所以这是一个大问题。例如,我需要能够模拟 Form 类以防止创建真正的窗口,例如通过“预期”ShowDialog。

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

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

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

或者是否有某种我没有想到的方法来构建我的类,以便表单耦合代码最终以简单复杂的方法和类结束,这样我就可以在不明确对它们进行单元测试的情况下逃脱,而不会被我的良心打败为了它?

4

2 回答 2

3

我听说过/用于使用 GUI 元素进行单元测试的最佳方法是Humble Dialog模式/方法。本质上,Forms 只是接口,所有真正的工作都在其他类中完成。您对提供功能的类进行单元测试,然后将您的 GUI 事件与这些类中的适当方法联系起来。

于 2008-09-24T16:16:52.280 回答
0

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

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

于 2008-09-24T16:13:14.020 回答