以编程方式为WPF单元测试生成keydown press

时间:2010-12-27 09:48:10

标签: unit-testing wpf-controls

我正在尝试对WPF控件进行单元测试,并且需要模拟按键按下。我已经看到了一个可能的解决方案here,但是当我尝试传入一个PresentationSource时,我一直得到一个空值(来自PresentationSource.FromVisual()或PresentationSource.FromDependencyObject()),这会触发异常。

我的问题是如何获得我可以在单元测试中使用的非null PresentationSource?

3 个答案:

答案 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,您将能够将键发送到控件。