【发布时间】:2012-11-30 07:46:47
【问题描述】:
我想在单元测试中引发一个关键事件。当按下某个键时,TextBox 的文本属性中应包含按下的键。
这是一个使用 Xunit 的最小工作示例:
[TemplatePart(Name = Field0Name, Type = typeof(TextBox))]
class MyControl : Control
{
public const string Field0Name = "Field0";
}
public class MyControlTests
{
private MyControl control;
public MyControlTests()
{
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms);
sw.Write(@"<ControlTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
<Grid>
<TextBox Name='Field0'/>
</Grid>
</ControlTemplate>");
sw.Flush();
ms.Position = 0;
control = new MyControl() { Template = (ControlTemplate)XamlReader.Load(ms) };
control.ApplyTemplate();
}
[Fact]
public void Field0Name_PreviewKeyDownEvent_WriteLetter()
{
TextBox tb = (TextBox)control.Template.FindName(MyControl.Field0Name, control);
FocusManager.SetFocusedElement(control, tb);
tb.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, new FakePresentationSource(), Environment.TickCount, Key.A)
{
RoutedEvent = TextBox.PreviewKeyDownEvent
});
Assert.Equal("a", tb.Text);
}
}
public class FakePresentationSource : PresentationSource
{
protected override CompositionTarget GetCompositionTargetCore()
{
return null;
}
public override Visual RootVisual { get; set; }
public override bool IsDisposed { get { return false; } }
}
Generic.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TextBoxRaiseEventProject">
<Style TargetType="{x:Type local:MyControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyControl}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<TextBox x:Name="Field0"/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
测试报告:
【问题讨论】:
-
你到底想测试什么?从您的代码示例来看,您似乎正在尝试测试 WPF TextBox 控件是否接受键盘输入。
-
@AbeHeidebrecht 也许是为了测试绑定是否正常工作。
-
我在文本框上注册了 PreviewKeyDownEvent 并过滤了一些输入。我想测试其他输入是否未被过滤。
-
如果@AbeHeidebrecht 是正确的,那么你肯定不想对微软的代码进行单元测试:) 我认为虽然你从一个错误的角度来测试你想要测试的东西? ..为您发布差异方法。
标签: c# wpf unit-testing controls keyevent