我目前正在为传统的Windows窗体应用程序编写系统测试。
在我的测试中,我调用Program.Main()
方法,然后在某个时刻调用Application.Run(new MainForm());
。
有没有办法用我能控制的东西替换Application.Run()?
具体来说,我需要能够停止执行并捕获未处理的异常。
答案 0 :(得分:2)
Application.ThreadExceptionHandler
AppDomain.CurrentDomain.UnhandledException
.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.");