Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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# 测试WinForms用户控件-子控件保持隐藏状态_C#_Winforms_Unit Testing_Testing_User Controls - Fatal编程技术网

C# 测试WinForms用户控件-子控件保持隐藏状态

C# 测试WinForms用户控件-子控件保持隐藏状态,c#,winforms,unit-testing,testing,user-controls,C#,Winforms,Unit Testing,Testing,User Controls,我正在用C#编写一个WinForms用户控件,并希望对其进行测试(不是TDD,我是从编写组件并使其工作开始的,但我有点厌倦了总是寻找bug,所以我现在想要测试)。我的问题是,我无法使子控件(弹出菜单)在测试期间可见。(我意识到它不会显示-我不希望它显示,但我仍然希望验证它在正常运行时是否会显示。) 以下是相关的测试代码: updater.Raise(it => it.StateChanged += null, AutoUpdaterState.Ok); [注意:以上是将引发事件的Mo

我正在用C#编写一个WinForms用户控件,并希望对其进行测试(不是TDD,我是从编写组件并使其工作开始的,但我有点厌倦了总是寻找bug,所以我现在想要测试)。我的问题是,我无法使子控件(弹出菜单)在测试期间可见。(我意识到它不会显示-我不希望它显示,但我仍然希望验证它在正常运行时是否会显示。)

以下是相关的测试代码:

  updater.Raise(it => it.StateChanged += null, AutoUpdaterState.Ok);
[注意:以上是将引发事件的Moq代码;它起作用,只需忽略细节并考虑“引发将导致菜单可见的事件”。]

下面是控件中的相关代码:

      checkToolStripMenuItem.Visible = true;

问题是。。。我在这行上放置了一个断点,在运行它之后Visible将保持为false。我理解这可能是因为我正在测试它,而菜单实际上并不可见。。。这没问题,但我如何测试它呢?

在测试UI代码时,如果使用某种MVC模式(例如WinForms的MVP)对其进行适当的结构化,通常会简单得多(如果您还没有这样做的话)

编写这些测试时,您甚至不应该在测试项目中引用WinForms。我通常在视图上有一个方法,例如ShowPopupMenu()。我测试的是,在某些情况下,演示者将调用此方法。我不测试特定的方法,因为我把这些简单的事情留给UI,99%的逻辑都在presenter中;要显示弹出菜单,需要一行代码


但是,如果您没有MVP,则有一些库可以帮助您测试WinForms,如

我喜欢MVP的想法,但我不明白如何实际测试“演示者将调用[ShowPopupMenu()]方法”,因为该方法也在演示者上,而不是在协作者上(因此我无法拦截调用)。我需要添加一些标志还是什么?嗯,我想我需要阅读更多关于MVP的内容。。。我刚刚意识到presenter和view:P不是一回事,您说过presenter调用视图上的方法。所以,我重申一下,你说我应该有一个非UI伪组件(presenter),它将管理实际的UI控件(视图),并且只测试这个presenter,对吗?我想我可以这样做。是的,你把所有东西都从视图中分离出来,这样视图就非常简单,不需要测试。检查MVP的被动视图和监控控制器风格。太好了,我想我现在明白了。谢谢
      checkToolStripMenuItem.Visible = true;