2010-12-27 14 views
15

Próbuję przetestować jednostkę kontroli WPF i trzeba zasymulować naciśnięcia klawiszy. Widziałem możliwe rozwiązanie here, jednak gdy próbuję przekazać w PresentationSource wciąż otrzymuję wartość null (od albo PresentationSource.FromVisual() lub PresentationSource.FromDependencyObject()), który wyzwala wyjątek.Programowe generowanie naciśnięć klawiszy dla testów jednostek WPF

Moje pytanie brzmi: jak uzyskać niedrewidowy zasób prezentacji, którego mogę używać w testach jednostkowych?

Odpowiedz

3

Wyznaczyłem to po przeczytaniu tego post.

Zasadniczo, musisz umieścić swoją kontrolę wewnątrz okna i wywołać Window.Show() na nim. Post wspomniał o błędzie WPF, ale nie spotkałem się z tym w WPF 4.

Po wywołaniu Window.Show(), źródło prezentacji nie będzie już puste i będziesz mógł wysyłać klucze do formantu.

+0

Wywołanie „InvokeShutdown” na „CurrentDispatcher” był brakującym ogniwem w rozwiązaniu „InvalidComObjectException” na wyjściu. Dzięki za link! – karmasponge

+4

Link jest martwy ... – Vaccano

17

można rozszerzyć klasę PresentationSource tak:

public class FakePresentationSource : PresentationSource 
{ 
    protected override CompositionTarget GetCompositionTargetCore() 
    { 
     return null; 
    } 

    public override Visual RootVisual { get; set; } 

    public override bool IsDisposed { get { return false; } } 
} 

i używać go tak:

var uiElement = new UIElement(); 

uiElement.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, new FakePresentationSource(), 0, Key.Delete) 
{ 
    RoutedEvent = UIElement.KeyDownEvent 
}); 
+0

To działa, podobnie jak Moq przez @ bill-tarbell – mungflesh

6

Szybszym rozwiązaniem dla testów jednostkowych jest tylko drwić obiekt PresentationSource. Pamiętaj, że wymaga to wątku STA. Próbka używa Moq i Nunit.

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