2009-03-12 17 views
1

ユニットテストを構築しようとしていて、DropEventを偽造したいと思います。WPFユニットテスト、UIElement.RaiseEvent、ArgumentException

イベントを発生させようとしているときにエラーが発生します。 DragEventArgsを作成できません。保護レベルは内部です。

私は、次のしている
System.ArgumentException : Object of type 'System.Windows.RoutedEventArgs' cannot be converted to type 'System.Windows.DragEventArgs' 

...

 [Test] 
    public void Test() 
    { 
     DesignerMock view = new DesignerMock(); 
     _viewModel = (PanelDesignViewModel)view.DataContext; 
     view.Show(); 

     Assert.IsNotNull(_viewModel); 

     RoutedEventArgs args = new RoutedEventArgs(DesignerCanvas.DropEvent,view.DesignerCanvas) ; 
     view.DesignerCanvas.RaiseEvent(args); 

     view.Close(); 

    } 

答えて

0

あなたはこのようにあなたのコードをテストすることを断固している場合は、DragEventArgsを作成するために反射を使用することができます。しかし、本当の疑問は、あなたがユニットテストで正しい方向に進んでいるかどうかということです。私は通常、自分のビューで直接テストを行うことを避け、今現在直面している問題のため、テスト容易なビューモデル(実際にMVVMを使用している場合)をテストすることに固執します。

+0

ほんとうに希望はありません。私はViewModelをテストしようとしていますが、イベントに反応します。私はイベントをリファクタリングすることができますが、VisualTreeHelperの機能はまだまだありますが、それにはモックビューが必要です。ありがとう。 – jeff

+0

ViewModelがUIイベントに直接応答している場合は、デザインに何か問題があります... MVVMの重要な原則である誤解されていることは、ViewModelがUIから独立しているということです –

1

ascalonxによると、ViewModelだけをテストするべきではありません。つまり、ViewModelをビューから切り離す必要があります。イベントハンドラの代わりに、必要な作業を行うViewModel上の簡単なパブリックメソッドを公開し、テストでこれを単に呼び出します。 Viewにこのメソッドを呼び出すには、添付の動作を使用します。 Caliburnには、これを行うための素晴らしい「アクション」アタッチされた動作があります。

あなたは、VisualTreeHelperのものがあると言います。これはVMを特定のV実装に結合するため、M-V-VMパターンに違反しています。あなたがそこで何をしているのか、それを "サービス"インターフェースに抽象化し、IoCまたはService Locatorを使用してこのサービスをあなたのVMに提供してください。私はOnyxを見ることを提案するかもしれません(免責事項:私はこのライブラリの著者です)。これは、VMにサービスを提供するための柔軟で使いやすいメカニズムを提供します。

関連する問題