【问题标题】:How can I write a unit test for a controller class that uses winforms for views?如何为使用 winforms 的控制器类编写单元测试?
【发布时间】:2010-09-12 18:54:06
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这并不一定是坏事,因为有了良好的计划,这不应该经常发生。如果这是拥有可靠且经过良好测试的代码的价格,我认为它的价格很低。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多