.net - 如何为使用 winforms 的 Controller 类编写单元测试?

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

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

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

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

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

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

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

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

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

最佳答案

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

关于.net - 如何为使用 winforms 的 Controller 类编写单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/128086/

相关文章:

c# - 查找单词的最后一次出现

c# - 如何检查字符串是否包含值数组?

.net - 统一容器: use ContainerControlledLifetimeManager by default for "Resolve" method group

visual-studio - 在 Visual Studio 中以不同用户身份运行测试

.net - 导致 “Arithmetic operation resulted in overflow”错误的System.DirectoryServices.DirectorySearcher

c# - 在C#.net中查找物理路径

c# - 如何使Windows窗体应用程序响应式?

javascript - 浏览器加载 html 页面时出现脚本错误

javascript - 开 Jest 没有找到测试

java - 如何模拟 Google Guava 缓存生成器?