我创建了一个自定义文本框,用于验证输入是否对输入的文本无效,从而对输入内容进行了一些操作。我有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;
}
}
答案 0 :(得分:1)
好吧,我会为您提供一些建议,为什么您要对表单进行单元测试?我认为,如果您的演示文稿和业务逻辑很好地分开,则只需要为业务逻辑创建单元测试,这些单元测试将是一些单独的类,当您确定它们正确时,然后当表单使用业务类时,您将确定该演示文稿可以正常工作,因此无需进入复杂的单元测试窗口窗体,只需为您的业务创建干净且独立的逻辑,以防万一您将桌面应用程序转移到了Web上,那么您可以重用这些经过测试的类容易。 如果您想确保表单UI能够按预期运行并且正确附加了事件,则可以检查自动化的UI测试,以测试常规功能,但是我认为在复杂的UI应用程序中这将非常有效。
答案 1 :(得分:0)
假设您使用的是Windows窗体,则可以将焦点设置到文本框,并使用SendKeys.Send方法将键发送到窗体:
textBox1.Focus();
SendKeys.Send("c");