19

我在单元测试项目中创建了一个测试,我想在其中使用其功能弹出一个表单:ShowDialog()

[TestMethod]
public void TestDialog()
{
  // This class inherits from Form
  TestForm serviceTestForm = new TestForm("My test form"); 
  serviceTestForm.ShowDialog();

  return;
}

我希望这个测试能够达到ShowDialog(),并“无限期地”运行,直到我关闭窗口。但是,当我“使用调试”运行此测试时,测试达到ShowDialog(),并且没有出现任何形式。奇怪的是,如果我“不调试”运行,这个完全相同的测试就可以工作。

我需要能够“带调试”运行测试并显示窗口。

其他注意事项:

  • Show()是不可取的,因为它不会等待窗口关闭才能继续。(此外......它不起作用。)
  • 相同的代码以前在另一个使用 .NET 3.5 的项目中工作过。这只是说该ShowDialog()策略以前确实有效。(是的,我直接复制了该工作代码。)
  • 我的问题与类似,但是,我的表单不是另一个对话框的子项,也不存在于父 UI 线程中。
4

2 回答 2

35

System.Windows.Forms尽管我尽量避免构建Load使用Visible = true. 当从测试方法调用 ShowDialog 时,这会强制表单可见。

private void form1_Load(object sender, EventArgs e)
{
    // To support calling ShowDialog from test method...
    this.Visible = true;
    ...
}

或者,只需从您的测试方法中观察表单实例并在那里执行相同的操作。至少这进一步缓解了这个问题,因为它可以防止黑客入侵您的表单代码。

var frm = new Form1();
frm.Load += (sender, e) => (sender as Form1).Visible = true;
frm.ShowDialog();
于 2013-09-04T16:27:15.600 回答
0

在我的情况下,使用 VS2017,设置属性ShowInTaskbar作为false诀窍。

这是用于显示对话框的完整代码:

form.TopMost = true;
form.StartPosition = FormStartPosition.CenterScreen;
form.ShowInTaskbar = false;
form.ShowDialog();

PS找到这个之后,我在Displaying Windows Forms inside unit test methods中看到了相同的解决方案

于 2019-10-15T10:20:25.797 回答