Программно вызывая проверку на TextBox - PullRequest
4 голосов
/ 08 декабря 2011

Я пишу модульные тесты для проверки правильности и правильности записи данных, введенных в графическом интерфейсе. В настоящее время я использую код, подобный этому:

using (MyControl target = new MyControl())
{
    PrivateObject accessor = new PrivateObject(target);
    TextBox inputTextBox = (TextBox)accessor.GetField("InputTextBox");
    string expected, actual;

    expected = "Valid input text.";
    inputTextBox.Text = expected;
    // InputTextBox.TextChanged sets FieldData.Input
    actual = target.FieldData.Input;
    Assert.AreEqual(expected, actual);
}

Но я бы предпочел использовать событие Validated над событием TextChanged.

using (MyControl target = new MyControl())
{
    PrivateObject accessor = new PrivateObject(target);
    TextBox inputTextBox = (TextBox)accessor.GetField("InputTextBox");
    string expected, actual;
    bool valid;

    expected = "Valid input text.";
    inputTextBox.Text = expected;
    valid = inputTextBox.Validate();
    // InputTextBox.Validating returns e.Cancel = true/false
    // InputTextBox.Validated sets FieldData.Input
    Assert.IsTrue(valid);
    actual = target.FieldData.Input;
    Assert.AreEqual(expected, actual);
}

Как вызвать проверку в текстовом поле или любом другом элементе управления, который поддерживает событие Validated? Что я должен написать вместо inputTextBox.Validate()? Мне комфортно с C # и VB.Net.

1 Ответ

4 голосов
/ 08 декабря 2011

Я не уверен, что я что-то здесь упускаю, но этот метод расширения работает:

private static readonly MethodInfo onValidating = typeof(Control).GetMethod("OnValidating", BindingFlags.Instance | BindingFlags.NonPublic);
private static readonly MethodInfo onValidated  = typeof(Control).GetMethod("OnValidated" , BindingFlags.Instance | BindingFlags.NonPublic);
public static bool Validate(this Control control)
{
    CancelEventArgs e = new CancelEventArgs();
    onValidating.Invoke(control, new object[] { e });
    if (e.Cancel) return false;
    onValidated.Invoke(control, new object[] { EventArgs.Empty });
    return true;
}

И вызывается с помощью:

valid = inputTextBox.Validate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...