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