2010-12-27 17 views
15

私はWPFコントロールを単体テストしようとしており、キーダウン・プレスをシミュレートする必要があります。私は可能な解決策hereを見ましたが、私はPresentationSourceを渡そうとすると、例外をトリガーするNull値(PresentationSource.FromVisual()またはPresentationSource.FromDependencyObject())を取得し続けます。WPF単体テスト用のキーダウン・プレスをプログラムで生成する

私の質問は、私が単体テストで使用できるnull以外のPresentationSourceを取得する方法です。

答えて

3

これを読んだ後、これを調べたのはpostです。

基本的には、コントロールをウィンドウ内に配置し、Window.Show()を呼び出す必要があります。投稿にはWPFのバグが記載されていましたが、WPF 4ではこれが発生しませんでした。

Window.Show()を呼び出した後、プレゼンテーションソースはnullにならなくなり、コントロールにキーを送ることができます。

+0

は、終了時に「InvalidComObjectException」を解決するにはミッシングリンクでした。リンクありがとう! – karmasponge

+4

リンクが死んでいる... – Vaccano

17

あなたはこのよう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 
}); 
+0

これは、@ bill-tarbellによるMoqの動作と同様に動作します – mungflesh

6

ユニットテストのための迅速な解決がちょうどPresentationSourceオブジェクトをモックすることです。 STAスレッドが必要であることに注意してください。 サンプルはMoqとnunitを使用しています。呼び出し「InvokeShutdown」「CurrentDispatcher」に

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