【问题标题】:Firing UI control events from a Unit Test从单元测试触发 UI 控件事件
【发布时间】:2008-09-19 00:04:10
【问题描述】:

作为 TDD 的初学者,我正在尝试编写一个测试,假设属性在 PropertyGrid(C#、WinForms、.NET 3.5)上的值已更改。

更改属性网格中对象的属性不会触发事件(很公平,因为它是 UI 引发的事件,所以我可以看到为什么更改拥有的对象可能对其不可见)。

在更改 SelectedNode 属性时,我也遇到了相同的问题,即在 TreeView 上触发 AfterSelect。

我可以有一个我的单元测试可以调用的函数来模拟 UI 事件将触发的代码,但这会使我的代码混乱,除非我将其公开,否则我将不得不在我正在测试的对象的同一个项目,甚至是同一个类(再次,我认为这是混乱的)。这对我来说似乎很难看,并且会遇到可维护性问题。

是否有进行这种基于 UI 的单元测试的约定

【问题讨论】:

    标签: c# winforms unit-testing


    【解决方案1】:

    要对代码进行单元测试,您需要模拟 UI 界面元素的对象。您可以使用许多工具来执行此操作,我不能推荐其中一个。在 at Phil Haack's blog 有一个很好的 MoQ 和 Rhino Mocks 之间的比较,我发现它很有用,可能对你有用。

    如果您使用 TDD,需要考虑的另一件事是为您的视图创建一个接口,这将有助于 TDD 流程。为此有一个设计模型(可能不止一个,但这是我使用的一个),称为模型视图演示器(现在分为被动视图和主管控制器)。遵循其中之一将使您的代码在未来更具可测试性。

    另外,请记住,测试 UI 本身不能通过单元测试来完成。另一个答案中已经建议的测试自动化工具将适用于此,但不适用于对您的代码进行单元测试。

    【讨论】:

      【解决方案2】:

      Microsoft 在 .Net Framework 中内置了 UI 自动化。您可以使用它来模拟用户以正常方式使用您的软件。

      有一篇 MSDN 文章“Using UI Automation for Automated Testing 这是一个很好的起点。

      【讨论】:

        【解决方案3】:

        由于其简单性,我推荐的一个选项是让您的 UI 在触发事件时调用一个辅助类或方法并对其进行单元测试。确保它(您在 UI 中的事件处理程序)具有尽可能少的逻辑,然后我相信您会知道该怎么做。

        在您的单元测试中达到 100% 的覆盖率可能非常困难。我所说的困难当然是指效率低下。即使你擅长这样的事情,在我看来,它可能会给你的代码库增加更多的复杂性,而不是你的单元测试所带来的好处。如果您不确定如何将您的逻辑分割成一个单独的类或方法,这是我很乐意帮助解决的另一个问题。

        我很想看看人们有哪些其他技术可以解决此类问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-09
          • 2023-03-22
          • 1970-01-01
          • 2010-12-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多