如何从测试类引发keyEvent

时间:2019-05-01 13:36:07

标签: c# moq keyevent

我创建了一个自定义文本框,用于验证输入是否对输入的文本无效,从而对输入内容进行了一些操作。我有onkeypress()和ontextchanged()事件来验证输入。我正在尝试使用NUnit测试此类。我的问题是如何从测试类触发onKeyPress事件。

public partial class InputDecimalQuantityTextBox : TextBox
{
    #region private
    //private variables
    #endregion private

    #region constructor
    /// <summary>
    /// 
    /// </summary>
    public InputDecimalQuantityTextBox()
    {
        InitializeComponent();
        CurrentDecimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
        DecimalSeparatorList = CultureInfo.GetCultures(CultureTypes.AllCultures)
                                    .Select(ci => ci.NumberFormat.NumberDecimalSeparator)
                                    .Distinct()
                                    .ToList();
        ignoreOnTextChanged = false;
        pasting = true;
    }

    #endregion constructor

    #region events
    /// <summary>
    /// Validate the input includes only numbers and allowed charaters(% and decimal separator)
    /// decimal separator can be a "." or "," based on region
    /// </summary>
    /// <param name="e"></param>
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        pasting = false;
        e.Handled = !ValidKeyPressed(e.KeyChar);

    }

    /// <summary>
    /// Clear textbox if the text is invalid
    /// </summary>
    /// <param name="e"></param>
    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);

        if (ignoreOnTextChanged)
        {
            ignoreOnTextChanged = false;
            return;
        }

        ValidateAndFormatInput();

        SelectionStart = Text.Length;
        pasting = true;
    }
    #endregion events

    private bool ValidKeyPressed(char InputCharacter)
    {
        bool isValid = true;

        if (!Char.IsDigit(InputCharacter))
        {
            isValid = false;

            if (!ValidDecimalSeparator(InputCharacter))
            {
                isValid = ValidateInput(InputCharacter);
            }
        }

        return isValid;
    }
}

2 个答案:

答案 0 :(得分:1)

好吧,我会为您提供一些建议,为什么您要对表单进行单元测试?我认为,如果您的演示文稿和业务逻辑很好地分开,则只需要为业务逻辑创建单元测试,这些单元测试将是一些单独的类,当您确定它们正确时,然后当表单使用业务类时,您将确定该演示文稿可以正常工作,因此无需进入复杂的单元测试窗口窗体,只需为您的业务创建干净且独立的逻辑,以防万一您将桌面应用程序转移到了Web上,那么您可以重用这些经过测试的类容易。 如果您想确保表单UI能够按预期运行并且正确附加了事件,则可以检查自动化的UI测试,以测试常规功能,但是我认为在复杂的UI应用程序中这将非常有效。

答案 1 :(得分:0)

假设您使用的是Windows窗体,则可以将焦点设置到文本框,并使用SendKeys.Send方法将键发送到窗体:

textBox1.Focus();
SendKeys.Send("c");