Программно генерировать нажатия клавиш для тестирования модулей WPF

Я пытаюсь использовать unit test элемент управления WPF и должен моделировать нажатия клавиш вниз. Я видел возможное решение здесь, однако, когда я пытаюсь передать в PresentationSource, я продолжаю получать нулевое значение (либо из PresentationSource.FromVisual() или PresentationSource.FromDependencyObject( )), который вызывает исключение.

Мой вопрос в том, как получить ненулевой PresentationSource, который я могу использовать в модульных тестах?

Ответы

Ответ 1

Понял это после прочтения этого post.

В принципе, вам нужно поставить свой контроль внутри окна и вызвать Window.Show() на нем. В сообщении упоминается ошибка WPF, но я не встречал этого в WPF 4.

После вызова Window.Show() источник презентации больше не будет null, и вы сможете отправлять ключи в элемент управления.

Ответ 2

Вы можете расширить класс 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 
});

Ответ 3

Более быстрое решение для модульных тестов - это просто фальсификация объекта PresentationSource. Обратите внимание, что для этого требуется поток STA. Образец использует Moq и nunit.

[Test]
[RequiresSTA]
public void test_something()
{
  new KeyEventArgs(
    Keyboard.PrimaryDevice,
    new Mock<PresentationSource>().Object,
    0,
    Key.Back);
}