Примечание. Перед прочтением ответа
В общем случае не стоит тесно связывать код пользовательского интерфейса и бизнес-логику, но в случае, если вы столкнулись с кодом, который не может бытьРеорганизованный для отделения от пользовательского интерфейса, вы можете использовать следующее решение для решения проблемы:
Проблема и решение
Перед показом формы, формы и ееэлементы управления не находятся в состоянии Created
, и вы не можете использовать метод Invoke
формы или ее элементов управления.
Чтобы решить проблему, вы можете принудительно создать форму и ее элементы управления.Для этого достаточно вызвать внутренний CreateControl(bool fIgnoreVisible)
метод вашей формы и передать true
в качестве параметра:
var f = new Form1();
var createControl = f.GetType().GetMethod("CreateControl",
BindingFlags.Instance | BindingFlags.NonPublic);
createControl.Invoke(f, new object[] { true });
Альтернативные решения
Пример
Допустим, у вас есть такой метод в вашей форме:
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);
}