如何使Application.Run()可测试

时间:2017-08-30 09:15:11

标签: c# winforms system-testing

我目前正在为传统的Windows窗体应用程序编写系统测试。

在我的测试中,我调用Program.Main()方法,然后在某个时刻调用Application.Run(new MainForm());

有没有办法用我能控制的东西替换Application.Run()?

具体来说,我需要能够停止执行并捕获未处理的异常。

2 个答案:

答案 0 :(得分:2)

  1. 要停止执行",您可以通过调用Application.ExitThread()来请求主线程退出,并且在它没有响应的可怕情况下,您可以使用{{{$}杀死主线程1}}作为最后的手段。
  2. 不会在任何地方为您自动收集例外情况,但您可以在使用
  3. 进行测试的过程中捕获它们
      

    Application.ThreadExceptionHandler

         

    AppDomain.CurrentDomain.UnhandledException

    1. 测试没有.Abort()的真实应用可能会有问题,因为人们经常通过调用Application.DoEvents(..)并使用消息泵来做其他事情来做一些技巧。

答案 1 :(得分:1)

您可以修改Program.Main以接受表单作为输入参数,默认为MainForm。引用类型不能具有非null默认值,但我们可以通过使用两个原型来完成相同的操作:

class Program
{
    //Normal entry point
    static public void Main()
    {
        Main(new MainForm());
    }

    //Internal & test entry point
    static public void Main(Form form)
    {
        DoSomeSetup();
        Application.Run(form);
    }
}

以正常方式运行程序时,它会使用MainForm

但是当你从测试项目中运行它时,可以像这样调用它:

Program.Main(new FormICanControl());

然后你可以控制它。

//Arrange
var t = new TestForm();

//Act
Program.Main(t);
t.ExecuteSomeTest();

//Assert
Assert.AreEqual(t.ResultCode, 0, "Test failed.");