Displaying Windows Forms inside unit test methods
我刚刚在 Visual Studio .NET 中发现了单元测试项目,并且正在使用测试方法来设置我开发的全局代码示例。
一些全局方法涉及显示可重复使用的对话框,例如日期选择器和输入框。问题是,有时表单会显示,有时不会。
我以为和模态有关,因为我有一个可以模态或非模态显示的报告预览表单。当我以非模态方式显示时,它不会显示。当我以模态方式显示它时,它确实如此。
尝试我的输入框总是不行:
1 2 3 4 5 6 7
| string input ="";
using (InputBox box = new InputBox(Title, Prompt, Default))
{
DialogResult result = box.ShowDialog();
input = box.txtInput.Text.Trim();
}
return input; |
执行在 "box.ShowDialog()" 行停止,此时我可以检查 box 并查看它的尺寸、位置和可见性都已正确配置——但我看不到表单。我必须取消测试才能停止一切。
我很想使用单元测试项目来充当现有代码的游乐场和展示,但如果我不能显示某些表格,它似乎非常有限。我意识到这并不是单元测试的真正意义,但我希望我可以通过这种方式构建一个有趣的小沙箱,以帮助我的开发人员加快速度。
- 一个对话框需要一个所有者窗口,它不太可能在单元测试中找到一个好的窗口。最小化窗口,直到找到它。不要在单元测试中使用对话框。
-
感谢您的回复!公平点——除了几个对话框每次都能正常工作。例如,我有一个日期选择器和日期范围选择器,它们总是正确显示。但后来我有一个输入框表单,其中 ShowDialog() 暂停执行并且表单永远不会显示。为什么两个 ShowDialog 调用或显示的表单之间会有差异?
-
汉斯,如果可以的话,请用你的评论作为答案——你让我走上了正确的道路。表单之间的区别在于,一个被实例化为纯代码驱动的类,而那些工作的被创建为 Windows 窗体文件,并通过package方法调用以显示它们并取回数据。当我将输入框转换为实际的 Windows 窗体时,我可以让它显示。必须与纯类与真正的"表单"时表单的显示方式有关(不知道为什么!)。还是蛮奇怪的……
-
不要在单元测试中使用对话框。我无法写出比这更多的答案。
-
谢谢你的帮助,汉斯,但我开始认为你没有阅读我的帖子......我并没有真正使用单元测试进行单元测试——我正在使用它将代码片段放在"沙箱"中" 类型的地方。如果您知道在 C# 中"播放"的更好方法,我会全力以赴。我来自 Foxpro 环境,在那里我从 Foxpro 的命令行窗口(很像 Python 的"空闲")中学到了最多的东西。所以,如果这是你的答案,它对我并没有真正的帮助(除非你知道另一种方式我可以为我的示例创建一个游乐场并尝试新的想法......)。此外,我想出了如何让它工作。
-
@sutekh137 听起来您正在寻找 REPL。您可以在 Visual Studio 2015 的 View -> Other Windows -> C# Interactive 下找到一个。 Mono 还提供了一个交互式shell。
-
@piedar 这很有趣!感谢您对链接的精彩评论,我能够加载 DLL,应用 "using" 并显示我的一个表单......我仍然喜欢使用测试方法的便利,但我也可以使用如果我想朝那个方向发展,可以使用带有片段的交互式shell。谢谢你的提示!如果您想将此作为答案发布,我肯定会接受...
我终于基于一个单一的表单属性获得了一些一致的成功(以及缺乏成功):ShowInTaskbar。
当表单将该属性设置为 true 时,此类表单将不会从单元测试方法中显示。当该属性为 false 时,将显示所有表单。因此,据我所知,这里是确保表单可以从单元测试中显示的规则:
-
该窗体应作为项目中的标准 Windows 窗体项创建。
-
窗体应将其 ShowInTaskbar 属性设置为 FALSE。
-
表单需要以模态方式显示(即使用 ShowDialog())。
这让我可以显示和测试我的所有实用程序表单,例如日期选择器和登录屏幕。
- 3年后,这解决了我的问题,非常感谢!
-
哇,没想到已经3年了!不过,很高兴它有所帮助。微笑 很高兴看到除了"你不应该在单元测试中使用表单......"之外的回应!
-
你不会相信我必须通过搜索词才能找到这个解决方案。对于上下文,这是我的问题 stackoverflow.com/questions/43414102/...。我发现的大多数文章要么是"如何对 winforms 进行单元测试",要么是"如何显示 winform",但它们是在 winform 应用程序中而不是在类库中。
-
搜索本身就变成了挑战——很高兴你能接受它!
-
这个问题中的要求似乎令人困惑,而这种困惑被评论放大了。如果您希望在单元测试中显示表单,那么它不是单元测试(单元测试不应该测试外部代码)。可能是您在评论中讨论此问题时遇到了语义问题。这些不是功能测试吗?
-
当您看到这篇文章时的表情,说"那是胡说八道",您尝试一下,它就起作用了...... MSTest 到底发生了什么,这是一个有效的解决方案?!我怀疑这一定是消息循环没有在 MSTest 环境中运行,但我已经纠正了。谢谢你,好先生!
我也有同样的问题。对话框闪烁可见然后消失。它已经是 TopMost,我尝试了另一个技巧,即在调用 showdialog 之前将其设置为可见然后不可见,但没有任何效果。
然后我检查了另一个工作正常的对话框,它的 ControlBox = true。我试过了,它成功了!
这绝对适用于这个问题。