2010-12-27 4 views
15

Estoy intentando probar la unidad con un control WPF y necesito simular pulsaciones de tecla. He visto una posible solución here, sin embargo, cuando trato de pasar un PresentationSource sigo obteniendo un valor nulo (de PresentationSource.FromVisual() o PresentationSource.FromDependencyObject()) que desencadena una excepción.Generación de pulsaciones de teclas mediante programación para pruebas de unidad WPF

Mi pregunta es ¿cómo obtengo un PresentationSource no nulo que puedo usar en pruebas unitarias?

Respuesta

3

Lo descubrimos después de leer este post.

Básicamente, debe poner su control dentro de una ventana y llamar a Window.Show() en él. La publicación mencionaba un error de WPF, pero no encontré esto en WPF 4.

Después de llamar a Window.Show(), el origen de la presentación ya no será nulo y podrá enviar claves al control.

+0

Calling 'InvokeShutdown' en el 'CurrentDispatcher' fue el eslabón perdido en la resolución del 'InvalidComObjectException' en la salida. Gracias por el enlace! – karmasponge

+4

El enlace está muerto ... – Vaccano

17

Se puede extender la clase PresentationSource así:

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

    public override Visual RootVisual { get; set; } 

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

y utilizarlo como esto:

var uiElement = new UIElement(); 

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

Esto funciona, al igual que el Moq uno por @ bill-tarbell – mungflesh

6

Una solución más rápida para las pruebas de unidad es sólo para burlarse del objeto PresentationSource. Tenga en cuenta que requiere un hilo STA. La muestra usa Moq y nunit.

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