2010-12-27 1 views
15

Ich versuche Unit-Test eine WPF-Steuerung und muss Tasten drücken drücken. Ich habe eine mögliche Lösung here gesehen, aber wenn ich versuche, eine PresentationSource zu übergeben, bekomme ich einen Null-Wert (entweder von PresentationSource.FromVisual() oder PresentationSource.FromDependencyObject()), der eine Ausnahme auslöst.Programmatisch Keydown-Pressen für WPF-Komponententests generieren

Meine Frage ist, wie bekomme ich eine Nicht-Null-PresentationSource, die ich in Komponententests verwenden kann?

Antwort

3

Nach dem Lesen dieser post herausgefunden.

Im Grunde müssen Sie Ihr Steuerelement in ein Fenster setzen und Window.Show() darauf aufrufen. Der Beitrag erwähnte einen WPF-Fehler, aber ich habe dies in WPF 4 nicht gefunden.

Nach dem Aufrufen von Window.Show() wird die Präsentationsquelle nicht mehr null sein und Sie können Schlüssel an das Steuerelement senden.

+0

Aufruf ‚InvokeShutdown‘ auf dem ‚CurrentDispatcher‘ war das fehlende Glied bei der Lösung des ‚InvalidComObjectException‘ an der Ausfahrt. Danke für den Link! – karmasponge

+4

Link ist tot ... – Vaccano

17

Sie können die PresentationSource Klasse wie folgt erweitern:

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

    public override Visual RootVisual { get; set; } 

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

Und es wie folgt verwenden:

var uiElement = new UIElement(); 

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

Dies funktioniert, wie auch der Moq One ​​@ Bill-Tarbell – mungflesh

6

Eine schnellere Lösung für Unit-Tests ist einfach das PresentationSource Objekt zu verspotten. Beachten Sie, dass ein STA-Thread erforderlich ist. Beispiel verwendet Moq und Nunit.

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