注意 - 在阅读答案之前
一般来说,UI 代码和业务逻辑紧密耦合并不是一个好主意,但是如果您遇到无法重构以与 UI 解耦的代码,您可以使用以下解决方案来解决问题。
问题与解决方案
在显示表单之前,表单及其控件不处于Created https://msdn.microsoft.com/en-us/library/system.windows.forms.control.created(v=vs.110).aspx状态并且你不能使用Invoke
窗体或其控件的方法。
要解决该问题,您可以强制创建窗体及其控件。为此,调用内部就足够了CreateControl(bool fIgnoreVisible) http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Control.cs,9ab3870cc070ff91您的表格和通行证的方法true
将其作为参数:
var f = new Form1();
var createControl = f.GetType().GetMethod("CreateControl",
BindingFlags.Instance | BindingFlags.NonPublic);
createControl.Invoke(f, new object[] { true });
替代解决方案
Example
假设您的表单中有这样的方法:
public partial class Form1 : Form
{
//...
public int Method1(int i)
{
this.Invoke(new Action(() => { i++; }));
return i;
}
}
然后在您的测试项目中,您可以使用以下代码:
[TestMethod]
public void TestMethod1()
{
var f = new Form1();
var createControl = f.GetType().GetMethod("CreateControl",
BindingFlags.Instance | BindingFlags.NonPublic);
createControl.Invoke(f, new object[] { true });
var input = 0;
var expected = 1;
var actual = f.Method1(input);
Assert.AreEqual(expected, actual);
}