Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从单元测试触发UI控制事件_C#_Winforms_Unit Testing - Fatal编程技术网

C# 从单元测试触发UI控制事件

C# 从单元测试触发UI控制事件,c#,winforms,unit-testing,C#,Winforms,Unit Testing,作为TDD的初学者,我正在尝试编写一个测试,该测试假设PropertyGrid(C#,WinForms,.NET 3.5)上的某个属性的值已更改 在属性网格中更改对象的属性不会触发事件(这是一个UI引发的事件,因此我可以理解为什么更改所属对象可能对它不可见) 在更改SelectedNode属性时,我还遇到了同样的问题,即在树视图上触发一个AfterSelect 我可以有一个我的单元测试可以调用的函数来模拟UI事件将触发的代码,但这会使我的代码变得混乱,除非我公开它,否则我必须在我正在测试的对象的

作为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本身不能通过单元测试来完成。另一个答案中已经建议的测试自动化工具将适用于此,但不适用于代码的单元测试