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

3
作为TDD的初学者,我试图编写一个测试,假设在属性网格(PropertyGrid)上更改了属性的值(C#、WinForms、.NET 3.5)。
在属性网格上更改对象的属性不会触发事件(因为它是一个UI引发的事件,所以我可以理解为什么更改所有者对象可能对其不可见)。
我在TreeView中使用SelectedNode属性时也遇到了相同的问题,无法触发AfterSelect事件。
我可以编写一个函数,让我的单元测试调用它来模拟UI事件的代码,但这将使我的代码看起来混乱。除非我把它设为public,否则我必须在我正在测试的对象的同一项目中或甚至同一类中编写所有测试(再次确认为混乱)。这对我来说似乎很丑陋,并且会遭受可维护性方面的问题。
有没有一种惯例来进行这种基于UI的单元测试呢?
3个回答

5
为对您的代码进行单元测试,您需要模拟一个UI接口元素的对象。有许多工具可用于此,我无法推荐哪个更好。这里Phil Haack的博客上有关于MoQ和Rhino Mocks的很好的比较,我发现它很有用,可能对您也有用。
如果您正在使用TDD,考虑创建一个接口来管理视图将有助于TDD过程。有一个设计模式(可能不止一个,但这是我使用的一个)叫做Model View Presenter(现在分为被动视图和监管控制器)。遵循其中之一将使得您的代码更易于未来进行单元测试。
此外,请注意UI本身的测试不能通过单元测试来完成。虽然可以使用类似于自动化测试工具的方法,但不适合对你的代码进行单元测试。

2
Microsoft在.Net Framework中内置了UI Automation。您可以使用它来模拟用户以正常方式使用您的软件。
有一篇MSDN文章“使用UI Automation进行自动化测试”是一个很好的起点。

1

我建议的一个简单选项是让你的UI在事件触发时调用一个辅助类或方法,并对其进行单元测试。确保它(你的UI中的事件处理程序)尽可能少地包含逻辑,然后从那里开始,我相信你会知道该怎么做。

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

我会很感兴趣看看其他人处理这种问题的技巧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接