Программно генерировать нажатия клавиш для тестирования модулей 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);
}