从单元测试中触发UI控件事件

时间:2008-09-19 00:04:11

标签: c# winforms unit-testing

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

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

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

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

是否存在执行此类基于UI的单元测试的约定

3 个答案:

答案 0 :(得分:5)

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

如果您正在使用TDD,那么要考虑创建一个视图界面将有助于TDD过程。有一个设计模型(可能不止一个,但这是我使用的)称为模型视图展示器(现在分为被动视图和监督控制器)。其中一个将使您的代码在未来更加可测试。

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

答案 1 :(得分:2)

Microsoft在.Net Framework中内置了UI Automation。您可以使用此功能以正常方式模拟使用您软件的用户。

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

答案 2 :(得分:1)

我推荐的一个选项就是简单地让你的UI在激活事件和单元测试时调用辅助类或方法。确保它(UI中的事件处理程序)具有尽可能少的逻辑,然后从那里我确定你会知道该怎么做。

在单元测试中达到100%覆盖率可能非常困难。难度我的意思当然是低效的。即使你擅长这样的东西,在我看来,它可能会增加你的代码库的复杂性,而不是你的单元测试值得。如果您不确定如何将您的逻辑划分为单独的类或方法,那么这是我想要帮助的另一个问题。

我很想知道人们有什么其他技巧可以处理这类问题。