2009-03-11 40 views
5

私はWPFアプリケーションで作業しており、ModelViewViewModelデザインパターンを使用しています。ビューから出てくる多くのイベントがあり、ViewModelアクティビティが発生します。WPF MVVMとユニットテスト

これらのイベントをUnitTestから呼び出すには、どのような方法がありますか?たとえば、ドロップイベントをシミュレートしたいとします。私は実際にイベントを発生させるために、スタブビューを作成したくはありません。

ありがとうございました。

答えて

1

ViewModelクラスに直接ドロップイベントのイベントハンドラがあるようです。あなたのUIレイヤーにハンドラを持たせることは意味がありますか?それはあなたのViewModelで関数を呼び出すでしょうか?このようにして、単体テストは関数を呼び出すことができます(ViewModelに関する限り、ドラッグアンドドロップ操作をシミュレートします)。

さらに、ViewModelとUIコードを分離する方がよいでしょう。

16

MVVMパターンによると:ビューはViewModelに知っている

  • - それはそれへの参照を持っていますがいずれかの具体的なインスタンスまたはインターフェイスとして
  • ViewModelには、ビューについて知るべきではありませんすべて。

あなたがイベントを処理する必要がある場合は、それを行うには、私の知っている2つの方法があります。

1:  はあなたのviewmodelでコマンドを公開し、それをトリガーするためにデータバインディングを使用しますが。これは私の好みの方法、例えば次のとおりです。

class MyViewModel 
{ 
    public ICommand ClickCommand { get; set; } 
} 

<Button Command="{Binding Path=ClickCommand}" /> 

あなたがこれを行うならば、あなたは、単に手動myViewModel.ClickCommand.Executeを呼び出すことによってコマンドをテストすることができます。

2:  は、のviewmodelに機能を公開し、書き込み最小限.xaml.csファイル内のイベントを処理すると、関数を呼び出す例:

class MyViewModel 
{ 
    public void HandleClick(){ } 
} 

<Button Click="MyClickHandler"> 

//.xaml.cs file 
public void MyClickHandler(Object sender, EventArgs e) { 
    m_viewModel.HandleClick() 
} 

あなたがこれを行う場合は、手動でmyViewModel.HandleClickを呼び出すだけでテストできます。 MyClickHandlerコードを単体テストでテストするのは面倒です。

0

イベントを発生させないでください。ハンドラを呼び出すだけです(つまり、イベントハンドラはパブリックにする必要があり、イベントハンドラの中心的な引数はほとんどありません)。これがCaliburn(http://www.codeplex.com/caliburn)で「アクション」を使ってどのように行われているか調べてください。

0

Moqのようなモックフレームワークを使用しないのはなぜですか?彼らのクイックスタートを見て、それは模擬イベントのサンプルを持っています。 URLは:http://code.google.com/p/moq/wiki/QuickStart

です。