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

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

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

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

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

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

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

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

有帮助吗?

解决方案

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top