C# 从单元测试触发UI控制事件
作为TDD的初学者,我正在尝试编写一个测试,该测试假设PropertyGrid(C#,WinForms,.NET 3.5)上的某个属性的值已更改 在属性网格中更改对象的属性不会触发事件(这是一个UI引发的事件,因此我可以理解为什么更改所属对象可能对它不可见) 在更改SelectedNode属性时,我还遇到了同样的问题,即在树视图上触发一个AfterSelect 我可以有一个我的单元测试可以调用的函数来模拟UI事件将触发的代码,但这会使我的代码变得混乱,除非我公开它,否则我必须在我正在测试的对象的同一个项目,甚至类中编写我的所有测试(同样,我认为这是混乱)。这在我看来很难看,并且会遇到可维护性问题C# 从单元测试触发UI控制事件,c#,winforms,unit-testing,C#,Winforms,Unit Testing,作为TDD的初学者,我正在尝试编写一个测试,该测试假设PropertyGrid(C#,WinForms,.NET 3.5)上的某个属性的值已更改 在属性网格中更改对象的属性不会触发事件(这是一个UI引发的事件,因此我可以理解为什么更改所属对象可能对它不可见) 在更改SelectedNode属性时,我还遇到了同样的问题,即在树视图上触发一个AfterSelect 我可以有一个我的单元测试可以调用的函数来模拟UI事件将触发的代码,但这会使我的代码变得混乱,除非我公开它,否则我必须在我正在测试的对象的
是否有一个惯例来执行这种基于UI的单元测试呢?我推荐一个简单的选项,就是让UI在触发事件和单元测试时调用一个助手类或方法。确保它(UI中的事件处理程序)具有尽可能少的逻辑,然后我确定您将知道该怎么做 在单元测试中要达到100%的覆盖率是相当困难的。我所说的困难当然是指效率低下。在我看来,即使您擅长这样的事情,也可能会给代码库增加比单元测试更复杂的东西。如果您不确定如何将逻辑分割成单独的类或方法,那么这是另一个我很乐意帮助解决的问题
我很想看看人们在处理这类问题时还需要使用哪些其他技术。Microsoft在.Net Framework中内置了UI自动化。您可以使用它来模拟用户以正常方式使用您的软件
有一篇MSDN文章“这是一个很好的起点。要对代码进行单元测试,您需要模拟UI界面元素的对象。有很多工具可以用来做这件事,我不能推荐一个胜过另一个。这里有一个很好的MoQ和Rhino Mock的比较,我发现它很有用,可能对你有用 如果你正在使用TDD,那么创建一个界面可以帮助TDD过程。有一个设计模型(可能不止一个,但我使用的是一个)称为模型视图演示器(现在分为被动视图和监控控制器)。遵循其中一条将使您的代码在将来更易于测试 另外,请记住,测试UI本身不能通过单元测试来完成。另一个答案中已经建议的测试自动化工具将适用于此,但不适用于代码的单元测试