我正在尝试对WPF控件进行单元测试,并且需要模拟按键按下。我已经看到了一个可能的解决方案here,但是当我尝试传入一个PresentationSource时,我一直得到一个空值(来自PresentationSource.FromVisual()或PresentationSource.FromDependencyObject()),这会触发异常。
我的问题是如何获得我可以在单元测试中使用的非null PresentationSource?
答案 0 :(得分:19)
您可以像这样扩展PresentationSource类:
public class FakePresentationSource : PresentationSource
{
protected override CompositionTarget GetCompositionTargetCore()
{
return null;
}
public override Visual RootVisual { get; set; }
public override bool IsDisposed { get { return false; } }
}
并像这样使用它:
var uiElement = new UIElement();
uiElement.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, new FakePresentationSource(), 0, Key.Delete)
{
RoutedEvent = UIElement.KeyDownEvent
});
答案 1 :(得分:7)
单元测试的更快解决方案就是模拟PresentationSource对象。请注意,它需要一个STA线程。 Sample使用Moq和nunit。
[Test]
[RequiresSTA]
public void test_something()
{
new KeyEventArgs(
Keyboard.PrimaryDevice,
new Mock<PresentationSource>().Object,
0,
Key.Back);
}
答案 2 :(得分:3)
阅读此post后想出来。
基本上,您需要将控件放在Window中并在其上调用Window.Show()。该帖提到了一个WPF错误,但我没有在WPF 4中遇到过这个问题。
在调用Window.Show()之后,演示源将不再为null,您将能够将键发送到控件。