2010-12-27 8 views
15

Sto provando a testare un'unità un controllo WPF e ho bisogno di simulare le pressioni dei tasti. Ho visto una possibile soluzione here, tuttavia quando provo a passare in una PresentationSource continuo a ricevere un valore nullo (sia da PresentationSource.FromVisual() o PresentationSource.FromDependencyObject()) che innesca un'eccezione.Genera automaticamente le pressioni del tasto per i test delle unità WPF

La mia domanda è come ottengo un PresentationSource non nullo che posso usare nei test unitari?

risposta

3

Questo calcolato dopo aver letto questo post.

In sostanza, è necessario mettere il vostro controllo all'interno di una finestra e chiamare Window.Show() su di esso. Il post menzionava un bug WPF, ma non l'ho riscontrato in WPF 4.

Dopo aver richiamato Window.Show(), la sorgente di presentazione non sarà più nulla e sarà possibile inviare le chiavi al controllo.

+0

Calling 'InvokeShutdown' sul 'CurrentDispatcher' era l'anello mancante per risolvere la 'InvalidComObjectException' in uscita. Grazie per il link! – karmasponge

+4

Link is dead ... – Vaccano

17

È possibile estendere la classe PresentationSource in questo modo:

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

    public override Visual RootVisual { get; set; } 

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

e usarlo in questo modo:

var uiElement = new UIElement(); 

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

Funziona così, come quello di Moq di @ bill-tarbell – mungflesh

6

una soluzione più rapida per i test unitari è solo per deridere l'oggetto PresentationSource. Si noti che richiede un thread STA. L'esempio utilizza Moq e nunit.

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